discord-player 7.1.0 → 7.2.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +167 -21
- package/dist/index.js +687 -55
- package/dist/index.mjs +4 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __typeError = (msg) => {
|
|
7
9
|
throw TypeError(msg);
|
|
@@ -21,6 +23,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
21
23
|
return to;
|
|
22
24
|
};
|
|
23
25
|
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
26
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
|
+
mod
|
|
33
|
+
));
|
|
24
34
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
35
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
26
36
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
@@ -89,12 +99,14 @@ __export(src_exports, {
|
|
|
89
99
|
createContext: () => createContext,
|
|
90
100
|
createErisCompat: () => createErisCompat,
|
|
91
101
|
createFFmpegStream: () => createFFmpegStream,
|
|
102
|
+
createOceanicCompat: () => createOceanicCompat,
|
|
92
103
|
decode: () => decode,
|
|
93
104
|
deserialize: () => deserialize,
|
|
94
105
|
encode: () => encode,
|
|
95
106
|
getVoiceConnection: () => import_discord_voip6.getVoiceConnection,
|
|
96
107
|
getVoiceConnections: () => import_discord_voip6.getVoiceConnections,
|
|
97
108
|
isErisProxy: () => isErisProxy,
|
|
109
|
+
isOceanicProxy: () => isOceanicProxy,
|
|
98
110
|
joinVoiceChannel: () => import_discord_voip6.joinVoiceChannel,
|
|
99
111
|
onAfterCreateStream: () => onAfterCreateStream,
|
|
100
112
|
onBeforeCreateStream: () => onBeforeCreateStream,
|
|
@@ -115,6 +127,33 @@ module.exports = __toCommonJS(src_exports);
|
|
|
115
127
|
// src/compat/createErisCompat.ts
|
|
116
128
|
var import_v10 = require("discord-api-types/v10");
|
|
117
129
|
|
|
130
|
+
// src/compat/common.ts
|
|
131
|
+
var DiscordPlayerClientSymbol = Symbol("DiscordPlayerClient");
|
|
132
|
+
function createCompatClient(client, provider) {
|
|
133
|
+
Reflect.set(client, DiscordPlayerClientSymbol, provider);
|
|
134
|
+
return {
|
|
135
|
+
provider,
|
|
136
|
+
client
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
__name(createCompatClient, "createCompatClient");
|
|
140
|
+
function isClientProxy(client) {
|
|
141
|
+
return Reflect.get(client, DiscordPlayerClientSymbol) != null;
|
|
142
|
+
}
|
|
143
|
+
__name(isClientProxy, "isClientProxy");
|
|
144
|
+
function getCompatName(client) {
|
|
145
|
+
return Reflect.get(client, DiscordPlayerClientSymbol) ?? null;
|
|
146
|
+
}
|
|
147
|
+
__name(getCompatName, "getCompatName");
|
|
148
|
+
function isErisProxy(client) {
|
|
149
|
+
return getCompatName(client) === "Eris";
|
|
150
|
+
}
|
|
151
|
+
__name(isErisProxy, "isErisProxy");
|
|
152
|
+
function isOceanicProxy(client) {
|
|
153
|
+
return getCompatName(client) === "Oceanic";
|
|
154
|
+
}
|
|
155
|
+
__name(isOceanicProxy, "isOceanicProxy");
|
|
156
|
+
|
|
118
157
|
// src/utils/Util.ts
|
|
119
158
|
var import_promises = require("timers/promises");
|
|
120
159
|
|
|
@@ -406,7 +445,7 @@ function tryIntoThumbnailString(data) {
|
|
|
406
445
|
__name(tryIntoThumbnailString, "tryIntoThumbnailString");
|
|
407
446
|
|
|
408
447
|
// src/fabric/Track.ts
|
|
409
|
-
var _resource;
|
|
448
|
+
var _onSeek, _resource;
|
|
410
449
|
var _Track = class _Track {
|
|
411
450
|
/**
|
|
412
451
|
* Track constructor
|
|
@@ -435,6 +474,7 @@ var _Track = class _Track {
|
|
|
435
474
|
__publicField(this, "live", false);
|
|
436
475
|
__publicField(this, "bridgedExtractor", null);
|
|
437
476
|
__publicField(this, "bridgedTrack", null);
|
|
477
|
+
__privateAdd(this, _onSeek, null);
|
|
438
478
|
__privateAdd(this, _resource, null);
|
|
439
479
|
this.title = (0, import_discord.escapeMarkdown)(data.title ?? "");
|
|
440
480
|
this.author = data.author ?? "";
|
|
@@ -456,6 +496,26 @@ var _Track = class _Track {
|
|
|
456
496
|
this.cleanTitle = data.cleanTitle ?? Util.cleanTitle(this.title, this.source);
|
|
457
497
|
this.live = data.live ?? false;
|
|
458
498
|
}
|
|
499
|
+
/**
|
|
500
|
+
* Whether this track can be seeked
|
|
501
|
+
*/
|
|
502
|
+
get seekable() {
|
|
503
|
+
return __privateGet(this, _onSeek) !== null;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Set the onSeek event
|
|
507
|
+
* @param fn The onSeek event
|
|
508
|
+
*/
|
|
509
|
+
handleSeek(fn) {
|
|
510
|
+
__privateSet(this, _onSeek, fn);
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Request seek
|
|
514
|
+
* @param event The seek event
|
|
515
|
+
*/
|
|
516
|
+
async seek(event) {
|
|
517
|
+
if (__privateGet(this, _onSeek)) return __privateGet(this, _onSeek).call(this, event);
|
|
518
|
+
}
|
|
459
519
|
/**
|
|
460
520
|
* Sets audio resource for this track. This is not useful outside of the library.
|
|
461
521
|
* @param resource Audio resource
|
|
@@ -629,6 +689,7 @@ var _Track = class _Track {
|
|
|
629
689
|
return await fn(channel, this, options);
|
|
630
690
|
}
|
|
631
691
|
};
|
|
692
|
+
_onSeek = new WeakMap();
|
|
632
693
|
_resource = new WeakMap();
|
|
633
694
|
__name(_Track, "Track");
|
|
634
695
|
var Track = _Track;
|
|
@@ -1354,28 +1415,16 @@ var _Util = class _Util {
|
|
|
1354
1415
|
__name(_Util, "Util");
|
|
1355
1416
|
var Util = _Util;
|
|
1356
1417
|
var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
|
|
1357
|
-
const tracks = items instanceof Playlist ? items.tracks : Array.isArray(items) ? items : [items];
|
|
1358
1418
|
if (queue.maxSize < 1 || queue.maxSize === Infinity) return;
|
|
1419
|
+
const tracks = typeof items === "number" ? items : (items instanceof Playlist ? items.tracks : Array.isArray(items) ? items : [items]).length;
|
|
1359
1420
|
const maxCap = queue.getCapacity();
|
|
1360
|
-
if (maxCap < tracks
|
|
1361
|
-
throw new OutOfSpaceError("tracks queue", maxCap, tracks
|
|
1421
|
+
if (maxCap < tracks) {
|
|
1422
|
+
throw new OutOfSpaceError("tracks queue", maxCap, tracks);
|
|
1362
1423
|
}
|
|
1363
1424
|
}, "VALIDATE_QUEUE_CAP");
|
|
1364
1425
|
|
|
1365
1426
|
// src/compat/createErisCompat.ts
|
|
1366
|
-
var
|
|
1367
|
-
function isClientProxy(client) {
|
|
1368
|
-
return Reflect.get(client, DiscordPlayerClientSymbol) != null;
|
|
1369
|
-
}
|
|
1370
|
-
__name(isClientProxy, "isClientProxy");
|
|
1371
|
-
function getCompatName(client) {
|
|
1372
|
-
return Reflect.get(client, DiscordPlayerClientSymbol) ?? null;
|
|
1373
|
-
}
|
|
1374
|
-
__name(getCompatName, "getCompatName");
|
|
1375
|
-
function isErisProxy(client) {
|
|
1376
|
-
return Reflect.get(client, DiscordPlayerClientSymbol) === "Eris";
|
|
1377
|
-
}
|
|
1378
|
-
__name(isErisProxy, "isErisProxy");
|
|
1427
|
+
var DiscordPlayerClientSymbol2 = Symbol("DiscordPlayerClient");
|
|
1379
1428
|
function declareProperty(target, key, value) {
|
|
1380
1429
|
Reflect.set(target, key, value);
|
|
1381
1430
|
}
|
|
@@ -1414,8 +1463,8 @@ function createErisCompat(client) {
|
|
|
1414
1463
|
}
|
|
1415
1464
|
}
|
|
1416
1465
|
});
|
|
1417
|
-
Reflect.set(erisProxy,
|
|
1418
|
-
return erisProxy;
|
|
1466
|
+
Reflect.set(erisProxy, DiscordPlayerClientSymbol2, "Eris");
|
|
1467
|
+
return createCompatClient(erisProxy, "Eris").client;
|
|
1419
1468
|
}
|
|
1420
1469
|
__name(createErisCompat, "createErisCompat");
|
|
1421
1470
|
function erisVoiceStateUpdateProxy(client, proxy, handler) {
|
|
@@ -1649,6 +1698,283 @@ function erisUsersProxy(client, eris) {
|
|
|
1649
1698
|
}
|
|
1650
1699
|
__name(erisUsersProxy, "erisUsersProxy");
|
|
1651
1700
|
|
|
1701
|
+
// src/compat/createOceanicCompat.ts
|
|
1702
|
+
var import_v102 = require("discord-api-types/v10");
|
|
1703
|
+
var Oceanic = __toESM(require("oceanic.js"));
|
|
1704
|
+
var DiscordPlayerClientSymbol3 = Symbol("DiscordPlayerClient");
|
|
1705
|
+
function declareProperty2(target, key, value) {
|
|
1706
|
+
Reflect.set(target, key, value);
|
|
1707
|
+
}
|
|
1708
|
+
__name(declareProperty2, "declareProperty");
|
|
1709
|
+
function getProperty2(target, key) {
|
|
1710
|
+
return Reflect.get(target, key);
|
|
1711
|
+
}
|
|
1712
|
+
__name(getProperty2, "getProperty");
|
|
1713
|
+
function createOceanicCompat(client) {
|
|
1714
|
+
const { module: module2, error } = Util.require("oceanic.js");
|
|
1715
|
+
if (error) throw error;
|
|
1716
|
+
const oceanic = module2;
|
|
1717
|
+
oceanicVoiceEventsHandler(client);
|
|
1718
|
+
const oceanicProxy = new Proxy(client, {
|
|
1719
|
+
get(target, p) {
|
|
1720
|
+
switch (p) {
|
|
1721
|
+
case "users":
|
|
1722
|
+
return oceanicUsersProxy(target, oceanic);
|
|
1723
|
+
case "guilds":
|
|
1724
|
+
return oceanicGuildsProxy(target, oceanic);
|
|
1725
|
+
case "channels":
|
|
1726
|
+
return oceanicChannelsProxy(target, oceanic);
|
|
1727
|
+
case "__dp_voiceStateUpdate_proxy":
|
|
1728
|
+
return (handler) => oceanicVoiceStateUpdateProxy(target, oceanicProxy, handler);
|
|
1729
|
+
case "incrementMaxListeners":
|
|
1730
|
+
return () => {
|
|
1731
|
+
client.setMaxListeners(client.getMaxListeners() + 1);
|
|
1732
|
+
};
|
|
1733
|
+
case "decrementMaxListeners":
|
|
1734
|
+
return () => {
|
|
1735
|
+
const listeners = client.getMaxListeners() - 1;
|
|
1736
|
+
client.setMaxListeners(listeners < 0 ? 1 : listeners);
|
|
1737
|
+
};
|
|
1738
|
+
default:
|
|
1739
|
+
return target[p];
|
|
1740
|
+
}
|
|
1741
|
+
}
|
|
1742
|
+
});
|
|
1743
|
+
Reflect.set(oceanicProxy, DiscordPlayerClientSymbol3, "Oceanic");
|
|
1744
|
+
return createCompatClient(oceanicProxy, "Oceanic").client;
|
|
1745
|
+
}
|
|
1746
|
+
__name(createOceanicCompat, "createOceanicCompat");
|
|
1747
|
+
function oceanicVoiceStateUpdateProxy(client, proxy, handler) {
|
|
1748
|
+
client.on("voiceStateUpdate", (member, oldState) => {
|
|
1749
|
+
try {
|
|
1750
|
+
const proxiedOldState = {
|
|
1751
|
+
channelId: oldState.channelID,
|
|
1752
|
+
serverMute: oldState.mute,
|
|
1753
|
+
suppress: oldState.suppress,
|
|
1754
|
+
guild: {
|
|
1755
|
+
id: oldState.guild.id
|
|
1756
|
+
},
|
|
1757
|
+
member: {
|
|
1758
|
+
id: oldState.user.id
|
|
1759
|
+
}
|
|
1760
|
+
};
|
|
1761
|
+
const me = member.guild.members.get(client.user.id);
|
|
1762
|
+
const resolvedChannel = member.guild.channels.get(
|
|
1763
|
+
member.voiceState.channelID
|
|
1764
|
+
);
|
|
1765
|
+
const proxiedNewState = {
|
|
1766
|
+
channelId: member.voiceState.channelID,
|
|
1767
|
+
serverMute: member.voiceState.mute,
|
|
1768
|
+
suppress: member.voiceState.suppress,
|
|
1769
|
+
channel: oceanicResolvedChannelProxy(resolvedChannel, client),
|
|
1770
|
+
member: {
|
|
1771
|
+
id: member.id
|
|
1772
|
+
},
|
|
1773
|
+
guild: {
|
|
1774
|
+
id: member.guild.id,
|
|
1775
|
+
members: {
|
|
1776
|
+
me: {
|
|
1777
|
+
id: me?.id,
|
|
1778
|
+
voice: {
|
|
1779
|
+
async setRequestToSpeak(value) {
|
|
1780
|
+
return me?.voiceState;
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
};
|
|
1787
|
+
return handler(proxiedNewState, proxiedOldState);
|
|
1788
|
+
} catch {
|
|
1789
|
+
}
|
|
1790
|
+
});
|
|
1791
|
+
}
|
|
1792
|
+
__name(oceanicVoiceStateUpdateProxy, "oceanicVoiceStateUpdateProxy");
|
|
1793
|
+
function oceanicVoiceEventsHandler(client) {
|
|
1794
|
+
let adapters = getProperty2(client, "adapters");
|
|
1795
|
+
if (!adapters) {
|
|
1796
|
+
const collection = /* @__PURE__ */ new Map();
|
|
1797
|
+
adapters = collection;
|
|
1798
|
+
declareProperty2(client, "adapters", collection);
|
|
1799
|
+
}
|
|
1800
|
+
client.on("shardDisconnect", (_, shardId) => {
|
|
1801
|
+
for (const [guildId, adapter] of adapters.entries()) {
|
|
1802
|
+
if (client.guilds.get(guildId)?.shard.id === shardId) {
|
|
1803
|
+
adapter.destroy();
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
});
|
|
1807
|
+
client.on("packet", (packet) => {
|
|
1808
|
+
switch (packet.t) {
|
|
1809
|
+
case import_v102.GatewayDispatchEvents.VoiceServerUpdate: {
|
|
1810
|
+
const payload = packet.d;
|
|
1811
|
+
adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload);
|
|
1812
|
+
return;
|
|
1813
|
+
}
|
|
1814
|
+
case import_v102.GatewayDispatchEvents.VoiceStateUpdate: {
|
|
1815
|
+
const payload = packet.d;
|
|
1816
|
+
if (payload.guild_id && payload.session_id && payload.user_id === client.user.id) {
|
|
1817
|
+
adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload);
|
|
1818
|
+
}
|
|
1819
|
+
return;
|
|
1820
|
+
}
|
|
1821
|
+
default:
|
|
1822
|
+
break;
|
|
1823
|
+
}
|
|
1824
|
+
});
|
|
1825
|
+
}
|
|
1826
|
+
__name(oceanicVoiceEventsHandler, "oceanicVoiceEventsHandler");
|
|
1827
|
+
function oceanicChannelsProxy(client, oceanic) {
|
|
1828
|
+
const handler = {
|
|
1829
|
+
client,
|
|
1830
|
+
get cache() {
|
|
1831
|
+
return {
|
|
1832
|
+
get(id) {
|
|
1833
|
+
return client.getChannel(id);
|
|
1834
|
+
},
|
|
1835
|
+
has(id) {
|
|
1836
|
+
return id in client.channelGuildMap;
|
|
1837
|
+
}
|
|
1838
|
+
};
|
|
1839
|
+
},
|
|
1840
|
+
resolve(resolvable) {
|
|
1841
|
+
if (typeof resolvable === "string") {
|
|
1842
|
+
return oceanicResolvedChannelProxy(
|
|
1843
|
+
this.client.getChannel(resolvable),
|
|
1844
|
+
client
|
|
1845
|
+
);
|
|
1846
|
+
}
|
|
1847
|
+
if (resolvable instanceof Oceanic.GuildChannel) {
|
|
1848
|
+
return oceanicResolvedChannelProxy(resolvable, client);
|
|
1849
|
+
}
|
|
1850
|
+
},
|
|
1851
|
+
resolveId(resolvable) {
|
|
1852
|
+
const channel = this.resolve(resolvable);
|
|
1853
|
+
return channel?.id;
|
|
1854
|
+
}
|
|
1855
|
+
};
|
|
1856
|
+
return handler;
|
|
1857
|
+
}
|
|
1858
|
+
__name(oceanicChannelsProxy, "oceanicChannelsProxy");
|
|
1859
|
+
function oceanicResolvedChannelProxy(channel, client) {
|
|
1860
|
+
if (!channel) return;
|
|
1861
|
+
return new Proxy(channel, {
|
|
1862
|
+
get(target, p) {
|
|
1863
|
+
switch (p) {
|
|
1864
|
+
case "guild":
|
|
1865
|
+
return oceanicVoiceAdapterProxy(target.guild, client);
|
|
1866
|
+
case "members":
|
|
1867
|
+
return target.voiceMembers;
|
|
1868
|
+
case "isVoiceBased":
|
|
1869
|
+
return () => target.type === import_v102.ChannelType.GuildVoice || target.type === import_v102.ChannelType.GuildStageVoice;
|
|
1870
|
+
case "isVoice":
|
|
1871
|
+
return () => target.type === import_v102.ChannelType.GuildVoice;
|
|
1872
|
+
case "isStage":
|
|
1873
|
+
return () => target.type === import_v102.ChannelType.GuildStageVoice;
|
|
1874
|
+
default:
|
|
1875
|
+
return target[p];
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
});
|
|
1879
|
+
}
|
|
1880
|
+
__name(oceanicResolvedChannelProxy, "oceanicResolvedChannelProxy");
|
|
1881
|
+
function oceanicVoiceAdapterProxy(guild, client) {
|
|
1882
|
+
if (!guild) return;
|
|
1883
|
+
return new Proxy(guild, {
|
|
1884
|
+
get(target, p) {
|
|
1885
|
+
if (p === "voiceAdapterCreator") {
|
|
1886
|
+
return oceanicVoiceAdapterCreator(target, client);
|
|
1887
|
+
}
|
|
1888
|
+
return target[p];
|
|
1889
|
+
}
|
|
1890
|
+
});
|
|
1891
|
+
}
|
|
1892
|
+
__name(oceanicVoiceAdapterProxy, "oceanicVoiceAdapterProxy");
|
|
1893
|
+
function oceanicVoiceAdapterCreator(guild, client) {
|
|
1894
|
+
return (methods) => {
|
|
1895
|
+
let adapters = getProperty2(client, "adapters");
|
|
1896
|
+
if (!adapters) {
|
|
1897
|
+
const collection = /* @__PURE__ */ new Map();
|
|
1898
|
+
adapters = collection;
|
|
1899
|
+
declareProperty2(client, "adapters", collection);
|
|
1900
|
+
}
|
|
1901
|
+
adapters.set(guild.id, methods);
|
|
1902
|
+
return {
|
|
1903
|
+
sendPayload(payload) {
|
|
1904
|
+
if (guild.shard.status !== "ready") return false;
|
|
1905
|
+
guild.shard.send(payload.op, payload.d);
|
|
1906
|
+
return true;
|
|
1907
|
+
},
|
|
1908
|
+
destroy() {
|
|
1909
|
+
adapters.delete(guild.id);
|
|
1910
|
+
}
|
|
1911
|
+
};
|
|
1912
|
+
};
|
|
1913
|
+
}
|
|
1914
|
+
__name(oceanicVoiceAdapterCreator, "oceanicVoiceAdapterCreator");
|
|
1915
|
+
function oceanicGuildsProxy(client, oceanic) {
|
|
1916
|
+
return new Proxy(client.guilds, {
|
|
1917
|
+
get(target, p) {
|
|
1918
|
+
if (p === "cache") {
|
|
1919
|
+
return target;
|
|
1920
|
+
}
|
|
1921
|
+
if (p === "resolve" || p === "resolveId") {
|
|
1922
|
+
const resolver = /* @__PURE__ */ __name(function(resolvable) {
|
|
1923
|
+
if (typeof resolvable === "string") {
|
|
1924
|
+
return target.get(resolvable);
|
|
1925
|
+
}
|
|
1926
|
+
if (resolvable instanceof oceanic.Guild) {
|
|
1927
|
+
return resolvable;
|
|
1928
|
+
}
|
|
1929
|
+
if (resolvable instanceof oceanic.Member || resolvable instanceof oceanic.Guild || resolvable instanceof oceanic.GuildChannel || resolvable instanceof oceanic.Role) {
|
|
1930
|
+
return resolvable.guild;
|
|
1931
|
+
}
|
|
1932
|
+
}, "resolver");
|
|
1933
|
+
if (p === "resolve") {
|
|
1934
|
+
return resolver;
|
|
1935
|
+
}
|
|
1936
|
+
return (resolvable) => {
|
|
1937
|
+
const guild = resolver(resolvable);
|
|
1938
|
+
return guild?.id;
|
|
1939
|
+
};
|
|
1940
|
+
}
|
|
1941
|
+
return target[p];
|
|
1942
|
+
}
|
|
1943
|
+
});
|
|
1944
|
+
}
|
|
1945
|
+
__name(oceanicGuildsProxy, "oceanicGuildsProxy");
|
|
1946
|
+
function oceanicUsersProxy(client, oceanic) {
|
|
1947
|
+
return new Proxy(client.users, {
|
|
1948
|
+
get(target, p) {
|
|
1949
|
+
if (p === "cache") {
|
|
1950
|
+
return target;
|
|
1951
|
+
}
|
|
1952
|
+
if (p === "resolve" || p === "resolveId") {
|
|
1953
|
+
const resolver = /* @__PURE__ */ __name(function(resolvable) {
|
|
1954
|
+
if (typeof resolvable === "string") {
|
|
1955
|
+
return target.get(resolvable);
|
|
1956
|
+
}
|
|
1957
|
+
if (resolvable instanceof oceanic.User) {
|
|
1958
|
+
return resolvable;
|
|
1959
|
+
}
|
|
1960
|
+
if (resolvable instanceof oceanic.Member) {
|
|
1961
|
+
return resolvable.user;
|
|
1962
|
+
}
|
|
1963
|
+
}, "resolver");
|
|
1964
|
+
if (p === "resolve") {
|
|
1965
|
+
return resolver;
|
|
1966
|
+
}
|
|
1967
|
+
return (resolvable) => {
|
|
1968
|
+
const user = resolver(resolvable);
|
|
1969
|
+
return user?.id;
|
|
1970
|
+
};
|
|
1971
|
+
}
|
|
1972
|
+
return target[p];
|
|
1973
|
+
}
|
|
1974
|
+
});
|
|
1975
|
+
}
|
|
1976
|
+
__name(oceanicUsersProxy, "oceanicUsersProxy");
|
|
1977
|
+
|
|
1652
1978
|
// src/utils/PlayerEventsEmitter.ts
|
|
1653
1979
|
var import_utils = require("@discord-player/utils");
|
|
1654
1980
|
var _hasDebugger;
|
|
@@ -2411,14 +2737,30 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
|
|
|
2411
2737
|
this.audioPlayer.on("error", (error) => void this.emit("error", error));
|
|
2412
2738
|
this.dsp.onUpdate = () => {
|
|
2413
2739
|
if (!this.dsp) return;
|
|
2414
|
-
if (this.dsp.filters?.filters)
|
|
2740
|
+
if (this.dsp.filters?.filters) {
|
|
2415
2741
|
this.emit("dsp", this.dsp.filters?.filters);
|
|
2416
|
-
|
|
2742
|
+
}
|
|
2743
|
+
if (this.dsp.biquad?.filters) {
|
|
2417
2744
|
this.emit("biquad", this.dsp.biquad?.filters);
|
|
2418
|
-
|
|
2419
|
-
if (this.dsp.
|
|
2420
|
-
|
|
2421
|
-
|
|
2745
|
+
}
|
|
2746
|
+
if (this.dsp.equalizer) {
|
|
2747
|
+
this.emit("eqBands", this.dsp.equalizer.getEQ());
|
|
2748
|
+
}
|
|
2749
|
+
if (this.dsp.volume) {
|
|
2750
|
+
this.emit("volume", this.dsp.volume.volume);
|
|
2751
|
+
}
|
|
2752
|
+
if (this.dsp.resampler) {
|
|
2753
|
+
this.emit("sampleRate", this.dsp.resampler.getParameters());
|
|
2754
|
+
}
|
|
2755
|
+
if (this.dsp.compressor) {
|
|
2756
|
+
this.emit("compressor", this.dsp.compressor.getParameters());
|
|
2757
|
+
}
|
|
2758
|
+
if (this.dsp.reverb) {
|
|
2759
|
+
this.emit("reverb", this.dsp.reverb.getParameters());
|
|
2760
|
+
}
|
|
2761
|
+
if (this.dsp.seeker) {
|
|
2762
|
+
this.emit("seeker", this.dsp.seeker.getParameters());
|
|
2763
|
+
}
|
|
2422
2764
|
};
|
|
2423
2765
|
this.dsp.onError = (e) => this.emit("error", e);
|
|
2424
2766
|
this.voiceConnection.on(import_discord_voip.VoiceConnectionStatus.Disconnected, async (oldState, newState) => {
|
|
@@ -2556,10 +2898,11 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
|
|
|
2556
2898
|
filter: ops.biquadFilter,
|
|
2557
2899
|
disabled: ops?.disableBiquad
|
|
2558
2900
|
} : void 0,
|
|
2559
|
-
resampler: {
|
|
2901
|
+
resampler: ops?.sampleRate ? {
|
|
2902
|
+
inputSampleRate: 48e3,
|
|
2560
2903
|
targetSampleRate: ops?.sampleRate,
|
|
2561
2904
|
disabled: ops?.disableResampler
|
|
2562
|
-
},
|
|
2905
|
+
} : void 0,
|
|
2563
2906
|
equalizer: {
|
|
2564
2907
|
bandMultiplier: ops?.eq,
|
|
2565
2908
|
disabled: ops?.disableEqualizer
|
|
@@ -2567,8 +2910,37 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
|
|
|
2567
2910
|
volume: {
|
|
2568
2911
|
volume: ops?.volume,
|
|
2569
2912
|
disabled: ops?.disableVolume
|
|
2570
|
-
}
|
|
2913
|
+
},
|
|
2914
|
+
compressor: ops?.compressor ? {
|
|
2915
|
+
threshold: ops?.compressor.threshold,
|
|
2916
|
+
ratio: ops?.compressor.ratio,
|
|
2917
|
+
attack: ops?.compressor.attack,
|
|
2918
|
+
release: ops?.compressor.release,
|
|
2919
|
+
makeupGain: ops?.compressor.makeupGain,
|
|
2920
|
+
disabled: ops?.disableCompressor,
|
|
2921
|
+
kneeWidth: ops?.compressor.kneeWidth
|
|
2922
|
+
} : void 0,
|
|
2923
|
+
reverb: ops?.reverb ? {
|
|
2924
|
+
roomSize: ops?.reverb.roomSize,
|
|
2925
|
+
damping: ops?.reverb.damping,
|
|
2926
|
+
wetLevel: ops?.reverb.wetLevel,
|
|
2927
|
+
dryLevel: ops?.reverb.dryLevel,
|
|
2928
|
+
disabled: ops?.disableReverb
|
|
2929
|
+
} : void 0,
|
|
2930
|
+
seeker: ops?.seeker ? {
|
|
2931
|
+
disabled: ops?.disableSeeker,
|
|
2932
|
+
seekTarget: ops?.seeker.seekTarget,
|
|
2933
|
+
sampleRate: 48e3,
|
|
2934
|
+
channels: 2,
|
|
2935
|
+
totalDuration: ops?.seeker.totalDuration
|
|
2936
|
+
} : void 0
|
|
2571
2937
|
}) : src;
|
|
2938
|
+
if (this.dsp.seeker) {
|
|
2939
|
+
this.dsp.seeker.on("seek", (data) => {
|
|
2940
|
+
this.queue.node.requestSeek(data).catch(() => {
|
|
2941
|
+
});
|
|
2942
|
+
});
|
|
2943
|
+
}
|
|
2572
2944
|
if (this.queue.hasDebugger) {
|
|
2573
2945
|
this.queue.debug("Executing onAfterCreateStream hook...");
|
|
2574
2946
|
}
|
|
@@ -2614,6 +2986,15 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
|
|
|
2614
2986
|
get equalizer() {
|
|
2615
2987
|
return this.dsp?.equalizer || null;
|
|
2616
2988
|
}
|
|
2989
|
+
get compressor() {
|
|
2990
|
+
return this.dsp?.compressor || null;
|
|
2991
|
+
}
|
|
2992
|
+
get reverb() {
|
|
2993
|
+
return this.dsp?.reverb || null;
|
|
2994
|
+
}
|
|
2995
|
+
get seeker() {
|
|
2996
|
+
return this.dsp?.seeker || null;
|
|
2997
|
+
}
|
|
2617
2998
|
/**
|
|
2618
2999
|
* The player status
|
|
2619
3000
|
* @type {AudioPlayerStatus}
|
|
@@ -3039,6 +3420,10 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3039
3420
|
* Current playback duration with history included
|
|
3040
3421
|
*/
|
|
3041
3422
|
get playbackTime() {
|
|
3423
|
+
if (this.queue.filters.seeker) {
|
|
3424
|
+
const pos = this.queue.filters.seeker.getPosition();
|
|
3425
|
+
if (pos > 0) return pos;
|
|
3426
|
+
}
|
|
3042
3427
|
const dur = __privateGet(this, _progress) + this.streamTime;
|
|
3043
3428
|
return dur;
|
|
3044
3429
|
}
|
|
@@ -3057,14 +3442,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3057
3442
|
*/
|
|
3058
3443
|
get estimatedPlaybackTime() {
|
|
3059
3444
|
const dur = this.playbackTime;
|
|
3060
|
-
|
|
3445
|
+
const val = this.getDurationMultiplier() * dur;
|
|
3446
|
+
return val;
|
|
3061
3447
|
}
|
|
3062
3448
|
/**
|
|
3063
3449
|
* Estimated total duration of the player
|
|
3064
3450
|
*/
|
|
3065
3451
|
get estimatedDuration() {
|
|
3066
3452
|
const dur = this.totalDuration;
|
|
3067
|
-
|
|
3453
|
+
const val = Math.round(dur / this.getDurationMultiplier());
|
|
3454
|
+
if (this.queue.filters.resampler) {
|
|
3455
|
+
const ratio = this.queue.filters.resampler.getRatio();
|
|
3456
|
+
if (ratio <= 0) return val;
|
|
3457
|
+
return Math.round(val / ratio);
|
|
3458
|
+
}
|
|
3459
|
+
return val;
|
|
3068
3460
|
}
|
|
3069
3461
|
/**
|
|
3070
3462
|
* Total duration of the current audio track
|
|
@@ -3168,7 +3560,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3168
3560
|
});
|
|
3169
3561
|
}
|
|
3170
3562
|
if (duration < 0) duration = 0;
|
|
3171
|
-
|
|
3563
|
+
const seeker = this.queue.filters.seeker;
|
|
3564
|
+
if (seeker) {
|
|
3565
|
+
seeker.seek(duration);
|
|
3566
|
+
return true;
|
|
3567
|
+
}
|
|
3568
|
+
return this.queue.filters.triggerReplay(duration).then((v) => {
|
|
3569
|
+
if (v) {
|
|
3570
|
+
this.queue.emit(GuildQueueEvent.PlayerSeek, this.queue, {
|
|
3571
|
+
currentPosition: this.estimatedPlaybackTime,
|
|
3572
|
+
seekTarget: duration,
|
|
3573
|
+
totalDuration: this.estimatedDuration
|
|
3574
|
+
});
|
|
3575
|
+
}
|
|
3576
|
+
return v;
|
|
3577
|
+
});
|
|
3172
3578
|
}
|
|
3173
3579
|
/**
|
|
3174
3580
|
* Current volume
|
|
@@ -3313,8 +3719,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3313
3719
|
);
|
|
3314
3720
|
VALIDATE_QUEUE_CAP(this.queue, track);
|
|
3315
3721
|
this.queue.tracks.store.splice(index, 0, track);
|
|
3316
|
-
if (!this.queue.options.noEmitInsert)
|
|
3722
|
+
if (!this.queue.options.noEmitInsert) {
|
|
3317
3723
|
this.queue.emit(GuildQueueEvent.AudioTrackAdd, this.queue, track);
|
|
3724
|
+
}
|
|
3318
3725
|
}
|
|
3319
3726
|
/**
|
|
3320
3727
|
* Moves a track in the queue
|
|
@@ -3376,6 +3783,18 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3376
3783
|
}
|
|
3377
3784
|
return true;
|
|
3378
3785
|
}
|
|
3786
|
+
/**
|
|
3787
|
+
* Request the source to seek
|
|
3788
|
+
* @param data The seek parameters
|
|
3789
|
+
*/
|
|
3790
|
+
async requestSeek(data) {
|
|
3791
|
+
const track = this.queue.currentTrack;
|
|
3792
|
+
if (!track) return false;
|
|
3793
|
+
if (track.seekable) {
|
|
3794
|
+
return track.seek(data);
|
|
3795
|
+
}
|
|
3796
|
+
return this.queue.filters.triggerReplay(data.position);
|
|
3797
|
+
}
|
|
3379
3798
|
/**
|
|
3380
3799
|
* Play the given track
|
|
3381
3800
|
* @param res The track to play
|
|
@@ -3451,7 +3870,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3451
3870
|
return __privateMethod(this, _GuildQueuePlayerNode_instances, throw_fn).call(this, track, streamSrc.error);
|
|
3452
3871
|
if (!streamSrc.stream) {
|
|
3453
3872
|
if (this.queue.hasDebugger)
|
|
3454
|
-
this.queue.debug(
|
|
3873
|
+
this.queue.debug(
|
|
3874
|
+
"Failed to get stream from onBeforeCreateStream, attempting to extract stream using extractors..."
|
|
3875
|
+
);
|
|
3455
3876
|
await this.queue.player.extractors.context.provide(
|
|
3456
3877
|
{
|
|
3457
3878
|
id: crypto.randomUUID(),
|
|
@@ -3487,7 +3908,16 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3487
3908
|
disableVolume: this.queue.options.disableVolume,
|
|
3488
3909
|
disableFilters: this.queue.options.disableFilterer,
|
|
3489
3910
|
disableResampler: this.queue.options.disableResampler,
|
|
3490
|
-
|
|
3911
|
+
disableCompressor: this.queue.options.disableCompressor,
|
|
3912
|
+
disableReverb: this.queue.options.disableReverb,
|
|
3913
|
+
disableSeeker: this.queue.options.disableSeeker,
|
|
3914
|
+
compressor: this.queue.filters._lastFiltersCache.compressor ?? void 0,
|
|
3915
|
+
reverb: this.queue.filters._lastFiltersCache.reverb ?? void 0,
|
|
3916
|
+
seeker: {
|
|
3917
|
+
seekTarget: options.transitionMode && options.seek != null ? options.seek : null,
|
|
3918
|
+
totalDuration: track.durationMS ?? 0
|
|
3919
|
+
},
|
|
3920
|
+
sampleRate: this.queue.filters._lastFiltersCache.sampleRate ?? (typeof this.queue.options.resampler === "number" && this.queue.options.resampler > 0 ? this.queue.options.resampler : void 0),
|
|
3491
3921
|
biquadFilter: this.queue.filters._lastFiltersCache.biquad || void 0,
|
|
3492
3922
|
eq: this.queue.filters._lastFiltersCache.equalizer,
|
|
3493
3923
|
defaultFilters: this.queue.filters._lastFiltersCache.filters,
|
|
@@ -3516,14 +3946,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3516
3946
|
trackStreamConfig.dispatcherConfig.disableEqualizer,
|
|
3517
3947
|
trackStreamConfig.dispatcherConfig.disableFilters,
|
|
3518
3948
|
trackStreamConfig.dispatcherConfig.disableResampler,
|
|
3519
|
-
trackStreamConfig.dispatcherConfig.disableVolume
|
|
3949
|
+
trackStreamConfig.dispatcherConfig.disableVolume,
|
|
3950
|
+
trackStreamConfig.dispatcherConfig.disableCompressor,
|
|
3951
|
+
trackStreamConfig.dispatcherConfig.disableReverb,
|
|
3952
|
+
trackStreamConfig.dispatcherConfig.disableSeeker
|
|
3520
3953
|
].every((e) => !!e === true);
|
|
3521
3954
|
const needsFilters = !!trackStreamConfig.playerConfig.seek || !!this.queue.filters.ffmpeg.args.length;
|
|
3522
3955
|
const shouldSkipFFmpeg = !!trackStreamConfig.dispatcherConfig.skipFFmpeg && !needsFilters;
|
|
3523
3956
|
let finalStream;
|
|
3524
|
-
const demuxable = /* @__PURE__ */ __name((fmt) => [
|
|
3525
|
-
|
|
3526
|
-
|
|
3957
|
+
const demuxable = /* @__PURE__ */ __name((fmt) => [
|
|
3958
|
+
import_discord_voip2.StreamType.Opus,
|
|
3959
|
+
import_discord_voip2.StreamType.WebmOpus,
|
|
3960
|
+
import_discord_voip2.StreamType.OggOpus,
|
|
3961
|
+
import_discord_voip2.StreamType.Raw,
|
|
3962
|
+
"pcm"
|
|
3963
|
+
].includes(fmt), "demuxable");
|
|
3527
3964
|
if (shouldSkipFFmpeg && !(streamSrc.stream instanceof import_stream.Readable) && typeof streamSrc.stream !== "string" && demuxable(streamSrc.stream.$fmt)) {
|
|
3528
3965
|
const { $fmt, stream } = streamSrc.stream;
|
|
3529
3966
|
const shouldPCM = !daspDisabled;
|
|
@@ -3531,7 +3968,8 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3531
3968
|
this.queue.debug(
|
|
3532
3969
|
`skipFFmpeg is set to true and stream is demuxable, creating stream with type ${shouldPCM ? "pcm" : "opus"}`
|
|
3533
3970
|
);
|
|
3534
|
-
const
|
|
3971
|
+
const isRaw = $fmt === "pcm" || $fmt === import_discord_voip2.StreamType.Raw;
|
|
3972
|
+
const opusStream = isRaw || $fmt === import_discord_voip2.StreamType.Opus ? stream : $fmt === import_discord_voip2.StreamType.OggOpus ? (
|
|
3535
3973
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3536
3974
|
stream.pipe(new import_opus.OggDemuxer())
|
|
3537
3975
|
) : (
|
|
@@ -3539,14 +3977,18 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
|
3539
3977
|
stream.pipe(new import_opus.WebmDemuxer())
|
|
3540
3978
|
);
|
|
3541
3979
|
if (shouldPCM) {
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3980
|
+
if (isRaw) {
|
|
3981
|
+
finalStream = opusStream;
|
|
3982
|
+
} else {
|
|
3983
|
+
finalStream = opusStream.pipe(
|
|
3984
|
+
new import_opus.OpusDecoder({
|
|
3985
|
+
channels: 2,
|
|
3986
|
+
frameSize: 960,
|
|
3987
|
+
rate: 48e3
|
|
3988
|
+
})
|
|
3989
|
+
);
|
|
3990
|
+
trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Raw;
|
|
3991
|
+
}
|
|
3550
3992
|
} else {
|
|
3551
3993
|
finalStream = opusStream;
|
|
3552
3994
|
trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Opus;
|
|
@@ -3682,14 +4124,39 @@ createFallbackStream_fn = /* @__PURE__ */ __name(async function(track) {
|
|
|
3682
4124
|
this.queue.debug(
|
|
3683
4125
|
`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method...`
|
|
3684
4126
|
);
|
|
4127
|
+
const verifyFallbackStream = this.queue.options.verifyFallbackStream;
|
|
3685
4128
|
const fallbackStream = await this.queue.player.extractors.run(
|
|
3686
4129
|
async (extractor) => {
|
|
3687
4130
|
if (extractor.identifier === track.extractor?.identifier) return false;
|
|
3688
4131
|
if (this.queue.player.options.blockStreamFrom?.some(
|
|
3689
4132
|
(ext) => ext === extractor.identifier
|
|
3690
|
-
))
|
|
4133
|
+
)) {
|
|
3691
4134
|
return false;
|
|
4135
|
+
}
|
|
3692
4136
|
const query = `${track.title} ${track.author}`;
|
|
4137
|
+
if (verifyFallbackStream) {
|
|
4138
|
+
if (this.queue.hasDebugger) {
|
|
4139
|
+
this.queue.debug(
|
|
4140
|
+
`Fallback stream verification is enabled, validating query for Track { title: ${track.title}, url: ${track.url} } using ${extractor.identifier}...`
|
|
4141
|
+
);
|
|
4142
|
+
}
|
|
4143
|
+
const shouldProceed = await extractor.validate(
|
|
4144
|
+
query,
|
|
4145
|
+
track.queryType || track.source
|
|
4146
|
+
);
|
|
4147
|
+
if (!shouldProceed) {
|
|
4148
|
+
if (this.queue.hasDebugger)
|
|
4149
|
+
this.queue.debug(
|
|
4150
|
+
`Failed to validate query for Track { title: ${track.title}, url: ${track.url} } using ${extractor.identifier}`
|
|
4151
|
+
);
|
|
4152
|
+
return false;
|
|
4153
|
+
} else {
|
|
4154
|
+
if (this.queue.hasDebugger)
|
|
4155
|
+
this.queue.debug(
|
|
4156
|
+
`Query for Track { title: ${track.title}, url: ${track.url} } was validated using ${extractor.identifier}. Proceeding with extraction...`
|
|
4157
|
+
);
|
|
4158
|
+
}
|
|
4159
|
+
}
|
|
3693
4160
|
const fallbackTracks = await extractor.handle(query, {
|
|
3694
4161
|
requestedBy: track.requestedBy
|
|
3695
4162
|
});
|
|
@@ -4195,7 +4662,10 @@ var _GuildQueueAudioFilters = class _GuildQueueAudioFilters {
|
|
|
4195
4662
|
equalizer: [],
|
|
4196
4663
|
filters: [],
|
|
4197
4664
|
volume: 100,
|
|
4198
|
-
sampleRate: -1
|
|
4665
|
+
sampleRate: -1,
|
|
4666
|
+
compressor: null,
|
|
4667
|
+
reverb: null,
|
|
4668
|
+
sampleRateFilter: null
|
|
4199
4669
|
});
|
|
4200
4670
|
if (typeof this.queue.options.volume === "number") {
|
|
4201
4671
|
this._lastFiltersCache.volume = this.queue.options.volume;
|
|
@@ -4242,6 +4712,24 @@ var _GuildQueueAudioFilters = class _GuildQueueAudioFilters {
|
|
|
4242
4712
|
get resampler() {
|
|
4243
4713
|
return this.queue.dispatcher?.resampler || null;
|
|
4244
4714
|
}
|
|
4715
|
+
/**
|
|
4716
|
+
* Compressor transformer
|
|
4717
|
+
*/
|
|
4718
|
+
get compressor() {
|
|
4719
|
+
return this.queue.dispatcher?.compressor || null;
|
|
4720
|
+
}
|
|
4721
|
+
/**
|
|
4722
|
+
* Reverb transformer
|
|
4723
|
+
*/
|
|
4724
|
+
get reverb() {
|
|
4725
|
+
return this.queue.dispatcher?.reverb || null;
|
|
4726
|
+
}
|
|
4727
|
+
/**
|
|
4728
|
+
* PCM Seeker transformer
|
|
4729
|
+
*/
|
|
4730
|
+
get seeker() {
|
|
4731
|
+
return this.queue.dispatcher?.seeker || null;
|
|
4732
|
+
}
|
|
4245
4733
|
/**
|
|
4246
4734
|
* Replay current track in transition mode
|
|
4247
4735
|
* @param seek The duration to seek to
|
|
@@ -4297,7 +4785,7 @@ var _AFilterGraph = class _AFilterGraph {
|
|
|
4297
4785
|
equalizer: this.equalizer,
|
|
4298
4786
|
biquad: this.biquad,
|
|
4299
4787
|
filters: this.filters,
|
|
4300
|
-
sampleRate: this.resampler?.
|
|
4788
|
+
sampleRate: this.resampler?.sampleRate || 48e3,
|
|
4301
4789
|
volume: this.volume?.volume ?? 100
|
|
4302
4790
|
};
|
|
4303
4791
|
}
|
|
@@ -4590,7 +5078,27 @@ var GuildQueueEvent = {
|
|
|
4590
5078
|
/**
|
|
4591
5079
|
* Emitted when a queue is trying to add similar track for autoplay
|
|
4592
5080
|
*/
|
|
4593
|
-
WillAutoPlay: "willAutoPlay"
|
|
5081
|
+
WillAutoPlay: "willAutoPlay",
|
|
5082
|
+
/**
|
|
5083
|
+
* Emitted when sample rate is updated
|
|
5084
|
+
*/
|
|
5085
|
+
SampleRateUpdate: "sampleRateUpdate",
|
|
5086
|
+
/**
|
|
5087
|
+
* Emitted when a named sample rate filter is updated
|
|
5088
|
+
*/
|
|
5089
|
+
SampleRateFilterUpdate: "sampleRateFilterUpdate",
|
|
5090
|
+
/**
|
|
5091
|
+
* Emitted when reverb filter is updated
|
|
5092
|
+
*/
|
|
5093
|
+
ReverbUpdate: "reverbUpdate",
|
|
5094
|
+
/**
|
|
5095
|
+
* Emitted when compressor filter is updated
|
|
5096
|
+
*/
|
|
5097
|
+
CompressorUpdate: "compressorUpdate",
|
|
5098
|
+
/**
|
|
5099
|
+
* Emitted when seek is performed
|
|
5100
|
+
*/
|
|
5101
|
+
PlayerSeek: "playerSeek"
|
|
4594
5102
|
};
|
|
4595
5103
|
var TrackSkipReason = /* @__PURE__ */ ((TrackSkipReason2) => {
|
|
4596
5104
|
TrackSkipReason2["NoStream"] = "ERR_NO_STREAM";
|
|
@@ -4928,6 +5436,61 @@ var _GuildQueue = class _GuildQueue {
|
|
|
4928
5436
|
removeTrack(track) {
|
|
4929
5437
|
return this.node.remove(track);
|
|
4930
5438
|
}
|
|
5439
|
+
/**
|
|
5440
|
+
* Prepends a track or track resolvable to the queue
|
|
5441
|
+
* @param track The track resolvable to insert
|
|
5442
|
+
* @param index The index to insert the track at (defaults to 0). If > 0, the inserted track will be placed before the track at the given index.
|
|
5443
|
+
*/
|
|
5444
|
+
prepend(track, index = 0) {
|
|
5445
|
+
if (index < 0 || index > this.tracks.size) {
|
|
5446
|
+
throw new OutOfRangeError(
|
|
5447
|
+
"index",
|
|
5448
|
+
`${index}`,
|
|
5449
|
+
"0",
|
|
5450
|
+
`${this.tracks.size}`
|
|
5451
|
+
);
|
|
5452
|
+
}
|
|
5453
|
+
const count = Array.isArray(track) ? track.length : track instanceof import_utils6.Queue ? track.size : 1;
|
|
5454
|
+
VALIDATE_QUEUE_CAP(this, count);
|
|
5455
|
+
const insertionIndex = index === 0 ? 0 : index - 1;
|
|
5456
|
+
if (track instanceof Track) {
|
|
5457
|
+
this.node.insert(track, insertionIndex);
|
|
5458
|
+
this.emit(GuildQueueEvent.AudioTrackAdd, this, track);
|
|
5459
|
+
return;
|
|
5460
|
+
}
|
|
5461
|
+
const tracks = track instanceof import_utils6.Queue ? track.store : track;
|
|
5462
|
+
this.tracks.store.splice(insertionIndex, 0, ...tracks);
|
|
5463
|
+
if (!this.options.noEmitInsert) {
|
|
5464
|
+
this.emit(GuildQueueEvent.AudioTracksAdd, this, tracks);
|
|
5465
|
+
}
|
|
5466
|
+
}
|
|
5467
|
+
/**
|
|
5468
|
+
* Appends a track or track resolvable to the queue
|
|
5469
|
+
* @param track The track resolvable to insert
|
|
5470
|
+
* @param index The index to insert the track at (defaults to 0). If > 0, the inserted track will be placed after the track at the given index.
|
|
5471
|
+
*/
|
|
5472
|
+
append(track, index = 0) {
|
|
5473
|
+
if (index < 0 || index > this.tracks.size) {
|
|
5474
|
+
throw new OutOfRangeError(
|
|
5475
|
+
"index",
|
|
5476
|
+
`${index}`,
|
|
5477
|
+
"0",
|
|
5478
|
+
`${this.tracks.size}`
|
|
5479
|
+
);
|
|
5480
|
+
}
|
|
5481
|
+
const count = Array.isArray(track) ? track.length : track instanceof import_utils6.Queue ? track.size : 1;
|
|
5482
|
+
VALIDATE_QUEUE_CAP(this, count);
|
|
5483
|
+
if (track instanceof Track) {
|
|
5484
|
+
this.node.insert(track, index);
|
|
5485
|
+
this.emit(GuildQueueEvent.AudioTrackAdd, this, track);
|
|
5486
|
+
return;
|
|
5487
|
+
}
|
|
5488
|
+
const tracks = track instanceof import_utils6.Queue ? track.store : track;
|
|
5489
|
+
this.tracks.store.splice(index, 0, ...tracks);
|
|
5490
|
+
if (!this.options.noEmitInsert) {
|
|
5491
|
+
this.emit(GuildQueueEvent.AudioTracksAdd, this, tracks);
|
|
5492
|
+
}
|
|
5493
|
+
}
|
|
4931
5494
|
/**
|
|
4932
5495
|
* Inserts the track to the given index
|
|
4933
5496
|
* @param track The track to insert
|
|
@@ -5201,6 +5764,65 @@ attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
|
|
|
5201
5764
|
);
|
|
5202
5765
|
this.filters._lastFiltersCache.volume = f;
|
|
5203
5766
|
});
|
|
5767
|
+
const areObjectsDifferent = /* @__PURE__ */ __name((a, b) => {
|
|
5768
|
+
if (!a && !b) return false;
|
|
5769
|
+
if (!a || !b) return true;
|
|
5770
|
+
if (Object.keys(a).length !== Object.keys(b).length) return true;
|
|
5771
|
+
return Object.keys(a).some((k) => a[k] !== b[k]);
|
|
5772
|
+
}, "areObjectsDifferent");
|
|
5773
|
+
dispatcher.on("sampleRate", (f) => {
|
|
5774
|
+
if (this.filters._lastFiltersCache.sampleRate !== f.sampleRate) {
|
|
5775
|
+
this.emit(
|
|
5776
|
+
GuildQueueEvent.SampleRateUpdate,
|
|
5777
|
+
this,
|
|
5778
|
+
this.filters._lastFiltersCache.sampleRate,
|
|
5779
|
+
f.sampleRate
|
|
5780
|
+
);
|
|
5781
|
+
this.filters._lastFiltersCache.sampleRate = f.sampleRate;
|
|
5782
|
+
this.filters.seeker?.setSampleRate(f.sampleRate);
|
|
5783
|
+
this.filters.seeker?.setTotalDuration(this.node.estimatedDuration);
|
|
5784
|
+
}
|
|
5785
|
+
if (f.currentFilter !== this.filters._lastFiltersCache.sampleRateFilter) {
|
|
5786
|
+
this.emit(
|
|
5787
|
+
GuildQueueEvent.SampleRateFilterUpdate,
|
|
5788
|
+
this,
|
|
5789
|
+
this.filters._lastFiltersCache.sampleRateFilter ?? null,
|
|
5790
|
+
f.currentFilter
|
|
5791
|
+
);
|
|
5792
|
+
this.filters._lastFiltersCache.sampleRateFilter = f.currentFilter;
|
|
5793
|
+
}
|
|
5794
|
+
});
|
|
5795
|
+
dispatcher.on("reverb", (f) => {
|
|
5796
|
+
if (areObjectsDifferent(f, this.filters._lastFiltersCache.reverb)) {
|
|
5797
|
+
this.emit(
|
|
5798
|
+
GuildQueueEvent.ReverbUpdate,
|
|
5799
|
+
this,
|
|
5800
|
+
this.filters._lastFiltersCache.reverb ?? null,
|
|
5801
|
+
f
|
|
5802
|
+
);
|
|
5803
|
+
this.filters._lastFiltersCache.reverb = f;
|
|
5804
|
+
}
|
|
5805
|
+
});
|
|
5806
|
+
dispatcher.on("seeker", (f) => {
|
|
5807
|
+
if (this.hasDebugger) {
|
|
5808
|
+
this.debug(
|
|
5809
|
+
`Seeker >> Seeked to ${f.seekTarget}ms for Track ${this.currentTrack?.title}`
|
|
5810
|
+
);
|
|
5811
|
+
}
|
|
5812
|
+
if (f.seekTarget != null) this.node.setProgress(f.seekTarget);
|
|
5813
|
+
this.emit(GuildQueueEvent.PlayerSeek, this, f);
|
|
5814
|
+
});
|
|
5815
|
+
dispatcher.on("compressor", (f) => {
|
|
5816
|
+
if (areObjectsDifferent(f, this.filters._lastFiltersCache.compressor)) {
|
|
5817
|
+
this.emit(
|
|
5818
|
+
GuildQueueEvent.CompressorUpdate,
|
|
5819
|
+
this,
|
|
5820
|
+
this.filters._lastFiltersCache.compressor ?? null,
|
|
5821
|
+
f
|
|
5822
|
+
);
|
|
5823
|
+
this.filters._lastFiltersCache.compressor = f;
|
|
5824
|
+
}
|
|
5825
|
+
});
|
|
5204
5826
|
}, "#attachListeners");
|
|
5205
5827
|
removeListeners_fn = /* @__PURE__ */ __name(function(target) {
|
|
5206
5828
|
target.removeAllListeners();
|
|
@@ -5410,9 +6032,13 @@ var _GuildNodeManager = class _GuildNodeManager {
|
|
|
5410
6032
|
options.disableEqualizer ?? (options.disableEqualizer = false);
|
|
5411
6033
|
options.disableFilterer ?? (options.disableFilterer = false);
|
|
5412
6034
|
options.disableVolume ?? (options.disableVolume = false);
|
|
5413
|
-
options.disableResampler ?? (options.disableResampler =
|
|
6035
|
+
options.disableResampler ?? (options.disableResampler = false);
|
|
6036
|
+
options.disableCompressor ?? (options.disableCompressor = true);
|
|
6037
|
+
options.disableSeeker ?? (options.disableSeeker = true);
|
|
6038
|
+
options.disableReverb ?? (options.disableReverb = true);
|
|
5414
6039
|
options.disableFallbackStream ?? (options.disableFallbackStream = false);
|
|
5415
6040
|
options.enableStreamInterceptor ?? (options.enableStreamInterceptor = false);
|
|
6041
|
+
options.verifyFallbackStream ?? (options.verifyFallbackStream = false);
|
|
5416
6042
|
if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
|
|
5417
6043
|
options.onBeforeCreateStream = getGlobalRegistry().get(
|
|
5418
6044
|
"@[onBeforeCreateStream]"
|
|
@@ -5457,7 +6083,11 @@ var _GuildNodeManager = class _GuildNodeManager {
|
|
|
5457
6083
|
disableResampler: options.disableResampler,
|
|
5458
6084
|
disableVolume: options.disableVolume,
|
|
5459
6085
|
disableFallbackStream: options.disableFallbackStream,
|
|
5460
|
-
enableStreamInterceptor: options.enableStreamInterceptor
|
|
6086
|
+
enableStreamInterceptor: options.enableStreamInterceptor,
|
|
6087
|
+
verifyFallbackStream: options.verifyFallbackStream,
|
|
6088
|
+
disableCompressor: options.disableCompressor,
|
|
6089
|
+
disableSeeker: options.disableSeeker,
|
|
6090
|
+
disableReverb: options.disableReverb
|
|
5461
6091
|
});
|
|
5462
6092
|
this.cache.set(server.id, queue);
|
|
5463
6093
|
return queue;
|
|
@@ -5984,7 +6614,7 @@ var import_ffmpeg2 = require("@discord-player/ffmpeg");
|
|
|
5984
6614
|
// src/version.ts
|
|
5985
6615
|
var version = (
|
|
5986
6616
|
/* @__MACRO__ getVersion */
|
|
5987
|
-
"7.
|
|
6617
|
+
"7.2.0-dev.0"
|
|
5988
6618
|
);
|
|
5989
6619
|
|
|
5990
6620
|
// src/utils/DependencyReportGenerator.ts
|
|
@@ -6881,12 +7511,14 @@ var import_discord_voip6 = require("discord-voip");
|
|
|
6881
7511
|
createContext,
|
|
6882
7512
|
createErisCompat,
|
|
6883
7513
|
createFFmpegStream,
|
|
7514
|
+
createOceanicCompat,
|
|
6884
7515
|
decode,
|
|
6885
7516
|
deserialize,
|
|
6886
7517
|
encode,
|
|
6887
7518
|
getVoiceConnection,
|
|
6888
7519
|
getVoiceConnections,
|
|
6889
7520
|
isErisProxy,
|
|
7521
|
+
isOceanicProxy,
|
|
6890
7522
|
joinVoiceChannel,
|
|
6891
7523
|
onAfterCreateStream,
|
|
6892
7524
|
onBeforeCreateStream,
|
|
@@ -6903,4 +7535,4 @@ var import_discord_voip6 = require("discord-voip");
|
|
|
6903
7535
|
version,
|
|
6904
7536
|
...require("@discord-player/ffmpeg")
|
|
6905
7537
|
});
|
|
6906
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXIudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9ob29rcy9jb250ZXh0L2FzeW5jLWNvbnRleHQudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0udHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvdXRpbHMvRkZtcGVnU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvcXVldWUvU3luY2VkTHlyaWNzUHJvdmlkZXIudHMiLCAiLi4vc3JjL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQudHMiLCAiLi4vc3JjL2xyY2xpYi9McmNMaWIudHMiLCAiLi4vc3JjL3N0cmVhbS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyIsICIuLi9zcmMvdmVyc2lvbi50cyIsICIuLi9zcmMvUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQsIGlzRXJpc1Byb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5leHBvcnQge1xuICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgdHlwZSBQQ01GaWx0ZXJzLFxuICBRX0JVVFRFUldPUlRILFxuICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgQkFTU19FUV9CQU5EUyxcbiAgQUZfTklHSFRDT1JFX1JBVEUsXG4gIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICBGaWx0ZXJzQ2hhaW4gfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXIsXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9ucyxcbiAgam9pblZvaWNlQ2hhbm5lbCxcbiAgU3RyZWFtVHlwZSxcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgdHlwZSBKb2luQ29uZmlnLFxuICB0eXBlIEpvaW5Wb2ljZUNoYW5uZWxPcHRpb25zLFxuICB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJzsiLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSBFcmlzIGZyb20gJ2VyaXMnO1xuXG50eXBlIEVyaXNVc2VyUmVzb2x2YWJsZSA9IEVyaXMuVXNlciB8IHN0cmluZyB8IEVyaXMuTWVtYmVyO1xudHlwZSBFcmlzR3VpbGRSZXNvbHZhYmxlID1cbkVyaXMuR3VpbGQgfFxuc3RyaW5nIHxcbkVyaXMuTWVtYmVyIHxcbkVyaXMuR3VpbGRDaGFubmVsIHxcbkVyaXMuUm9sZTtcbnR5cGUgRXJpc0NoYW5uZWxSZXNvbHZhYmxlID0gRXJpcy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBlcmlzUHJveHkgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IEVyaXMuQ2xpZW50LFxucHJveHk6IEVyaXMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncmF3V1MnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHBheWxvYWQuZ3VpbGRfaWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnNlc3Npb25faWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc0NoYW5uZWxzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgY2xpZW50LFxuICAgIGdldCBjYWNoZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdldChpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRDaGFubmVsKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaWQgaW4gY2xpZW50LmNoYW5uZWxHdWlsZE1hcDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJlc29sdmUocmVzb2x2YWJsZTogc3RyaW5nIHwgRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG4gICAgICAgICAgdGhpcy5jbGllbnQuZ2V0Q2hhbm5lbChyZXNvbHZhYmxlKSBhcyBFcmlzLkd1aWxkQ2hhbm5lbCxcbiAgICAgICAgICBjbGllbnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmFibGUsIGNsaWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNvbHZlSWQocmVzb2x2YWJsZTogRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5yZXNvbHZlKHJlc29sdmFibGUpO1xuICAgICAgcmV0dXJuIGNoYW5uZWw/LmlkO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuY2hhbm5lbDogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoY2hhbm5lbCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICdndWlsZCc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJQcm94eSh0YXJnZXQuZ3VpbGQsIGNsaWVudCk7XG4gICAgICAgIGNhc2UgJ21lbWJlcnMnOlxuICAgICAgICAgIHJldHVybiAodGFyZ2V0IGFzIEVyaXMuVm9pY2VDaGFubmVsKS52b2ljZU1lbWJlcnM7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2VCYXNlZCc6XG4gICAgICAgICAgcmV0dXJuICgpID0+XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2UgfHxcbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShcbmd1aWxkOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ3VpbGQpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGd1aWxkLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICd2b2ljZUFkYXB0ZXJDcmVhdG9yJykge1xuICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IodGFyZ2V0LCBjbGllbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKFxuZ3VpbGQ6IEVyaXMuR3VpbGQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIHtcbiAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4oKTtcbiAgICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIGFkYXB0ZXJzLnNldChndWlsZC5pZCwgbWV0aG9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZFBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoZ3VpbGQuc2hhcmQuc3RhdHVzICE9PSAncmVhZHknKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBhZGFwdGVycy5kZWxldGUoZ3VpbGQuaWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVyaXNHdWlsZHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuTWVtYmVyIHx8XG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5Sb2xlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3VpbGQgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn0iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBUcmFja1NvdXJjZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBPdXRPZlNwYWNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmlsdGVyLFxuICBjcmVhdGVTcG90aWZ5RmlsdGVyLFxuICBmaXhUcmFja1N1ZmZpeCxcbiAgcmVtb3ZlTGl2ZSxcbiAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgeW91dHViZSxcbiAgcmVtb3ZlWmVyb1dpZHRoLFxuICByZXBsYWNlTmJzcCxcbiAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICByZW1vdmVDbGVhbkV4cGxpY2l0IH0gZnJvbVxuJ0B3ZWItc2Nyb2JibGVyL21ldGFkYXRhLWZpbHRlcic7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID0gJ25vZGUnIHwgJ2Rlbm8nIHwgJ2J1bicgfCAndW5rbm93bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAvKipcbiAgICogVGltZSBpbiBkYXlzXG4gICAqL1xuICBkYXlzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIGhvdXJzXG4gICAqL1xuICBob3VyczogbnVtYmVyO1xuICAvKipcbiAgICogVGltZSBpbiBtaW51dGVzXG4gICAqL1xuICBtaW51dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICovXG4gIHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lIHtcbiAgbmFtZTogUnVudGltZVR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBVdGlsc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRSdW50aW1lKCk6IFJ1bnRpbWUge1xuICAgIGNvbnN0IHZlcnNpb24gPVxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdW4gIT09ICd1bmRlZmluZWQnICYmIEJ1bi52ZXJzaW9uKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4geyBuYW1lOiAnYnVuJywgdmVyc2lvbjogQnVuLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbilcbiAgICByZXR1cm4geyBuYW1lOiAnbm9kZScsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbiB9O1xuXG4gICAgcmV0dXJuIHsgbmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiB2ZXJzaW9uID8/ICd1bmtub3duJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iaikuXG4gICAgbWFwKChtKSA9PiBpc05hTihtKSA/IDAgOiBtKS5cbiAgICBqb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwXG4gICAgfSBhcyBUaW1lRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGltZSBjb2RlXG4gICAqIEBwYXJhbSB7VGltZURhdGF9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBidWlsZFRpbWVDb2RlKGR1cmF0aW9uOiBUaW1lRGF0YSkge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXMoZHVyYXRpb24pO1xuICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgY29uc3QgcGFyc2VkID0gaXRlbXMuXG4gICAgZmlsdGVyKCh4KSA9PiByZXF1aXJlZC5pbmNsdWRlcyh4KSkuXG4gICAgbWFwKChtKSA9PiBkdXJhdGlvblttIGFzIGtleW9mIFRpbWVEYXRhXSk7XG4gICAgY29uc3QgZmluYWwgPSBwYXJzZWQuXG4gICAgc2xpY2UocGFyc2VkLmZpbmRJbmRleCgoeCkgPT4geCAhPT0gMCkpLlxuICAgIG1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpLlxuICAgIGpvaW4oJzonKTtcblxuICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHN0YXRpYyBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUaW1lQ29kZSh0aGlzLnBhcnNlTVMoZHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAqIEBwYXJhbSB7YW55W119IGFyciBUaGUgYXJyYXlcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0YXRpYyBsYXN0PFQgPSBhbnk+KGFycjogVFtdKTogVCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZvaWNlRW1wdHkoY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB0aGUgdHJhY2sgdGl0bGVcbiAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZVxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2VcbiAgICogQHJldHVybnMgQ2xlYW5lZCB0aXRsZVxuICAgKi9cbiAgc3RhdGljIGNsZWFuVGl0bGUodGl0bGU6IHN0cmluZywgc291cmNlOiBUcmFja1NvdXJjZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWx0ZXJPcHRzID0ge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdHJhY2s6IFtcbiAgICAgICAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgICAgICAgcmVtb3ZlTGl2ZSxcbiAgICAgICAgZml4VHJhY2tTdWZmaXgsXG4gICAgICAgIHJlbW92ZVplcm9XaWR0aCxcbiAgICAgICAgcmVwbGFjZU5ic3AsXG4gICAgICAgIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgICAgICAgcmVtb3ZlQ2xlYW5FeHBsaWNpdF1cblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAneW91dHViZSc6XG4gICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICBjYXNlICdzcG90aWZ5JzpcbiAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlciByZXF1aXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBOb2RlIHJlcXVpcmUgaWRcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHN0YXRpYyByZXF1aXJlKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiByZXF1aXJlKGlkKSwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBpbXBvcnQoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIHN0YXRpYyB3YWl0KHRpbWU6IG51bWJlcikge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KHRpbWUsIHVuZGVmaW5lZCwgeyByZWY6IGZhbHNlIH0pO1xuICB9XG5cbiAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBhc3luYyBnZXRGZXRjaCgpIHtcbiAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBbJ25vZGUtZmV0Y2gnLCAndW5kaWNpJ10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKFxuICAgICAgICAgIChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdDtcbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvLyBubz9cbiAgICAgICAgfX1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSAnRGVwcmVjYXRpb25XYXJuaW5nJywgZGV0YWlsPzogc3RyaW5nKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICBjb2RlLFxuICAgICAgZGV0YWlsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICB9XG5cbiAgc3RhdGljIGFycmF5Q2xvbmVTaHVmZmxlPFQ+KHNyYzogVFtdKTogVFtdIHtcbiAgICBjb25zdCBhcnIgPSBzcmMuc2xpY2UoKTtcblxuICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChtKSB7XG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbS0tKTtcbiAgICAgIFthcnJbbV0sIGFycltpXV0gPSBbYXJyW2ldLCBhcnJbbV1dO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdKSA9Plxue1xuICBjb25zdCB0cmFja3MgPVxuICBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID9cbiAgaXRlbXMudHJhY2tzIDpcbiAgQXJyYXkuaXNBcnJheShpdGVtcykgP1xuICBpdGVtcyA6XG4gIFtpdGVtc107XG5cbiAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXJyb3IoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTsiLCAiaW1wb3J0IHtcbiAgVXNlcixcbiAgZXNjYXBlTWFya2Rvd24sXG4gIFNub3dmbGFrZVV0aWwsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgQVBJVXNlciB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBQbGF5bGlzdCwgUGxheWxpc3RKU09OIH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBBdWRpb1Jlc291cmNlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gIG1ldGFkYXRhOiBNO1xuICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPVxuJ3NvdW5kY2xvdWQnIHxcbid5b3V0dWJlJyB8XG4nc3BvdGlmeScgfFxuJ2FwcGxlX211c2ljJyB8XG4nYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAvKipcbiAgICogVGhlIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICB2aWV3czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0XG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAvKipcbiAgICogVGhlIHNvdXJjZVxuICAgKi9cbiAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgZW5naW5lXG4gICAqL1xuICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByYXcgZGF0YVxuICAgKi9cbiAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0eXBlXG4gICAqL1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXplZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHJhdzogYW55O1xuICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICBwdWJsaWMgY2xlYW5UaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgYnJpZGdlZFRyYWNrOiBUcmFjayB8IG51bGwgPSBudWxsO1xuXG4gICNyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVHJhY2sgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICogQHBhcmFtIGRhdGEgVHJhY2sgZGF0YVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIsXG4gIGRhdGE6IFBhcnRpYWw8V2l0aE1ldGFkYXRhPFJhd1RyYWNrRGF0YSwgVD4+KVxuICB7XG4gICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3IgPz8gJyc7XG4gICAgdGhpcy51cmwgPSBkYXRhLnVybCA/PyAnJztcbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgIHRoaXMuZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uID8/ICcnO1xuICAgIHRoaXMudmlld3MgPSBkYXRhLnZpZXdzID8/IDA7XG4gICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICB0aGlzLnJlcXVlc3RlZEJ5ID0gZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICAgIHRoaXMucGxheWxpc3QgPSBkYXRhLnBsYXlsaXN0O1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgdGhpcy5yYXcgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7IHNvdXJjZTogZGF0YS5yYXc/LnNvdXJjZSA/PyBkYXRhLnNvdXJjZSB9LFxuICAgICAgZGF0YS5yYXcgPz8gZGF0YVxuICAgICk7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSA/PyBudWxsO1xuICAgIHRoaXMuX19yZXFNZXRhZGF0YUZuID1cbiAgICBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgdGhpcy5jbGVhblRpdGxlID1cbiAgICBkYXRhLmNsZWFuVGl0bGUgPz8gVXRpbC5jbGVhblRpdGxlKHRoaXMudGl0bGUsIHRoaXMuc291cmNlKTtcbiAgICB0aGlzLmxpdmUgPSBkYXRhLmxpdmUgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFjay4gVGhpcyBpcyBub3QgdXNlZnVsIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBBdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHNldFJlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXVkaW8gcmVzb3VyY2UgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT5cbiAgICBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQoXG4gIHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pXG4gIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnZGF0YScsXG4gICAgICAnU2VyaWFsaXplZFRyYWNrJyxcbiAgICAgICdtYWxmb3JtZWQgZGF0YSdcbiAgICApO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpXG4gICAgICAgICAgcmV0dXJuIHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuZ2V0KHJlcy5pZCkhO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKCkgOlxuICAgICAgbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogZGF0YS5xdWVyeV90eXBlID8/IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT5cbiAgICBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKVxuICAgICk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJleHBvcnQgY2xhc3MgRGlzY29yZFBsYXllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlcztcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29kZTogRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlNwYWNlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLFxuICAgICAgYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJnVHlwZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19SRVNVTFQsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfSU1QTEVNRU5URUQsIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RFeGlzdGluZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfRVhJU1RJTkcsIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgICBgJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21pbmltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04sXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PydcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQsXG4gICAgICAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCwgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMLCAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVjZWl2ZXJFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1JFQ0VJVkVSLFxuICAgICAgbWVzc2FnZSB8fFxuICAgICAgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX0FVRElPX1JFU09VUkNFLFxuICAgICAgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTkZPX1JFUVVJUkVELFxuICAgICAgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCxcbiAgICAgIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtcbiAgICAgIGlkID8gYChFeHRyYWN0b3IgRXhlY3V0aW9uIENvbnRleHQgSUQgaXMgJHtpZH0pYCA6ICcnfUZhaWxlZCB0byBicmlkZ2UgdGhpcyBxdWVyeTpcXG4ke1xuICAgICAgZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgRVJSX09VVF9PRl9TUEFDRTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgRVJSX05PX1JFU1VMVDogJ0VSUl9OT19SRVNVTFQnLFxuICBFUlJfTk9UX0lNUExFTUVOVEVEOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gIEVSUl9OT1RfRVhJU1RJTkc6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgRVJSX09VVF9PRl9SQU5HRTogJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6ICdFUlJfTk9fVk9JQ0VfQ0hBTk5FTCcsXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX05PX1JFQ0VJVkVSOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgRVJSX0ZGTVBFR19MT0NBVE9SOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgRVJSX05PX0FVRElPX1JFU09VUkNFOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgRVJSX05PX0dVSUxEX1FVRVVFOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgRVJSX05PX0dVSUxEOiAnRVJSX05PX0dVSUxEJyxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ0VSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRTogJ0VSUl9OT1RfRVhJU1RJTkdfTU9EVUxFJyxcbiAgRVJSX0JSSURHRV9GQUlMRUQ6ICdFUlJfQlJJREdFX0ZBSUxFRCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVycm9yQ29kZXMgPSAodHlwZW9mIEVycm9yQ29kZXMpW2tleW9mIHR5cGVvZiBFcnJvckNvZGVzXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIGVycm9yIGluc3RhbmNlb2YgRGlzY29yZFBsYXllckVycm9yO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhIGBEaXNjb3JkUGxheWVyRXJyb3JgIGVycm9yLlxuICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBoYW5kbGVcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGVycm9yIGlzIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAuXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGhhbmRsZXJcbiAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IsIChlcnJvcikgPT4ge1xuICogICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSBkaXNjb3JkLXBsYXllcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICogIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3I8XG4gIFQgZXh0ZW5kcyBhbnlbXSxcbiAgRiBleHRlbmRzIChlcnJvcjogRGlzY29yZFBsYXllckVycm9yLCAuLi5hcmdzOiBUKSA9PiBhbnksXG4gIFIgZXh0ZW5kcyBSZXR1cm5UeXBlPEY+PihcbmVycm9yOiBhbnksIGhhbmRsZXI6IEYsIGFyZ3M6IFQpOiBSIHtcbiAgaWYgKGlzRGlzY29yZFBsYXllckVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBoYW5kbGVyKGVycm9yLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8iLCAiaW1wb3J0IHsgRGlzY29yZFBsYXllckVycm9yLCBpc0Rpc2NvcmRQbGF5ZXJFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIFR5cGVVdGlsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0OiB1bmtub3duKTogdCBpcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICAgIHJldHVybiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0KTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IERlc2VyaWFsaXphdGlvbkVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIHR5cGUgU2VyaWFsaXplZFRyYWNrLFxuICBUcmFjayxcbiAgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbVxuJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgVHJhY2sgPSAndHJhY2snLFxuICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PlxuZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgaWYgKGlzVHJhY2soZGF0YSkpIHJldHVybiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKFR5cGVVdGlsLmlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwgImltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tKU09OLCBUcmFja1NvdXJjZSB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgdHJhY2tzOiBUcmFja1tdO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICovXG4gIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIHB1YmxpYyBhdXRob3I6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgLyoqXG4gICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllclxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICogLSBgYWxidW1gXG4gICAgICogLSBgcGxheWxpc3RgXG4gICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgKi9cbiAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdClcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkUGxheWxpc3QnLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEluZm9SZXF1aXJlZEVycm9yLCBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9XG4vXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPVxuL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID1cbi9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyBkaXNjb3JkLXBsYXllcjovL2Jsb2IvdXVpZC12NFxuY29uc3QgZGlzY29yZFBsYXllckJsb2JSZWdleCA9IC9eZGlzY29yZC1wbGF5ZXI6XFwvXFwvYmxvYlxcL1xcZCskLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICBEaXNjb3JkUGxheWVyOiBbJ2Rpc2NvcmQtcGxheWVyJ10sXG4gIFlvdVR1YmU6IFtcbiAgJ3lvdXR1YmUuY29tJyxcbiAgJ3lvdXR1LmJlJyxcbiAgJ211c2ljLnlvdXR1YmUuY29tJyxcbiAgJ2dhbWluZy55b3V0dWJlLmNvbScsXG4gICd3d3cueW91dHViZS5jb20nLFxuICAnbS55b3V0dWJlLmNvbSddLFxuXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4vXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbi9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL11cbik7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIC0gRElTQ09SRF9QTEFZRVJfQkxPQlxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgVklNRU86ICd2aW1lbycsXG4gIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gIEZJTEU6ICdmaWxlJyxcbiAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJyxcbiAgRElTQ09SRF9QTEFZRVJfQkxPQjogJ2Rpc2NvcmRQbGF5ZXJCbG9iJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlUeXBlID0gKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgUXVlcnlUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gIHF1ZXJ5OiBzdHJpbmc7XG59XG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAvKipcbiAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgdmltZW9SZWdleCxcbiAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXgsXG4gICAgICBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5cbiAgICAgICAgICAgIHNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uXG4gICAgICAgICAgICBzcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgP1xuICAgICAgICAgIHJlcy51cmwgOlxuICAgICAgICAgIHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEluZm9SZXF1aXJlZEVycm9yKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsIHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID9cbiAgICBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6XG4gICAgbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICBzb2Z0bGltaXRlcjpcbiAgICAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgIHNpbGVuY2VyZW1vdmU6ICdzaWxlbmNlcmVtb3ZlPTE6MDotNTBkQidcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHtcbiAgICBuYW1lOiBGaWx0ZXJzTmFtZTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIHJldHVybiBmaWx0ZXJzLlxuICAgIGZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykuXG4gICAgbWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKS5cbiAgICBqb2luKCcsJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheToge25hbWU6IHN0cmluZzt2YWx1ZTogc3RyaW5nO31bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufSIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxcbiAgTCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzXG5FdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAoXG4gICAgdGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSlcbiAgICB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+XG4gIGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgcHVibGljIG9wdGlvbnM6IFQgPSA8VD4ge30pXG4gIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpXG4gIDogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCBjb250ZXh0O1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3MoXG4gIHRyYWNrOiBUcmFjayxcbiAgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPilcbiAge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKFxuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCxcbiAgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSlcbiAgOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbClcbiAgOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufSIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEJyaWRnZUZhaWxlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAqL1xuICBhY3RpdmF0ZTogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBkZWFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLFxuICBlcnJvcjogRXJyb3IpXG4gID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEV4dHJhY3RvclNlc3Npb24+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZFxuICAgKi9cbiAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBgXFx0aW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcXG5cXHRhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO2A7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfVxcbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgICBUW251bWJlcl1bJ2lkZW50aWZpZXInXSxcbiAgICAgIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPj4oXG5cbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmIChcbiAgICB0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fFxuICAgIHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgY29uc3QgZXh0cmFjdG9yID1cbiAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgP1xuICAgIHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDpcbiAgICB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgIGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhcbiAgICAgICAgYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KFxuICBmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sXG4gIGZpbHRlckJsb2NrZWQgPSB0cnVlKVxuICB7XG4gICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLFxuICAgICAgICAnTm9FeHRyYWN0b3JzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgIGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyKVxuICAgIHJldHVybiB7XG4gICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgZXJyb3I6IGVycixcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpXG4gIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID1cbiAgICB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8XG4gICAgICByZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJ1xuICAgICk7XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gcmVzdWx0LmV4dHJhY3RvcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSlcbiAge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoXG5leHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG49PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7IiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVmYXVsdFZhbHVlPzogVCkge31cblxuICAvKipcbiAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgdGhpcy5zdG9yYWdlLmV4aXQoc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdW1lKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn0iLCAiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTsiLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0L2FzeW5jLWNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzQ3R4IHtcbiAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtwbGF5ZXJdJykgYXMgUGxheWVyIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcsIG1haW5Pbmx5ID0gZmFsc2UpIHtcbiAgbGV0IGlzRmFsbGJhY2sgPSBmYWxzZTtcblxuICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCEocGxheWVyID0gU1VQRVJfQ09OVEVYVC5jb25zdW1lKCkpKSB7XG4gICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgaXNGYWxsYmFjayA9IHRydWU7XG4gIH1cblxuICBpZiAoIXBsYXllcilcbiAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgYFBsYXllciBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUsICR7XG4gICAgaXNGYWxsYmFjayA/XG4gICAgJ2RpZCB5b3UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIHBsYXllciB3aXRoIGBuZXcgUGxheWVyKGNsaWVudClgPycgOlxuICAgICdpcyBpdCBiZWluZyBjYWxsZWQgaW5zaWRlIDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpPyd9YFxuXG4gICk7XG5cbiAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgbGV0IGNvbnRleHQ6IEhvb2tzQ3R4IHwgdW5kZWZpbmVkO1xuXG4gIGlmICghaXNGYWxsYmFjaykge1xuICAgIGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpXG4gICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgaG9va05hbWUsXG4gICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQgPSB7XG4gICAgICBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvcihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGFzIHVua25vd24gYXMgSG9va3NDdHg7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0LCBwbGF5ZXIsIGlzRmFsbGJhY2sgfTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUubm9kZTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUuXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGUuIERlZmF1bHRzIHRvIGluZmVycmVkIGd1aWxkIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVF1ZXVlJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5yZXNvbHZlPE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZTtcbn0iLCAiaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgW1xuICAoKSA9PiBULFxuICAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSlcbiAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZTogTm9kZVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVRpbWVsaW5lIHtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IHZvbHVtZTogbnVtYmVyO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gIHBhdXNlKCk6IGJvb2xlYW47XG4gIHJlc3VtZSgpOiBib29sZWFuO1xuICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoKTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pXG46IEd1aWxkUXVldWVUaW1lbGluZSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoXG5vcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0gc2F0aXNmaWVzIEd1aWxkUXVldWVUaW1lbGluZSk7XG5cbiAgcmV0dXJuIHRpbWVsaW5lO1xufSIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25BZnRlckNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xudHlwZSBWb2x1bWVEaXNwYXRjaCA9IHJlYWRvbmx5IFtcbiAgKCkgPT4gbnVtYmVyLFxuICAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKCk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlOiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlPzogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbih2b2x1bWUpKVxuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgQmlxdWFkRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZSxcbiAgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVGYWxsYmFja1N0cmVhbT86IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihcbiAgZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KVxuICA6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3JcbiAgICB9KTtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHNlcnZlci5pZCwgcXVldWUpO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+IHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBxdWV1ZSBleGlzdHNcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGhhcyhub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkID1cbiAgICBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/XG4gICAgbm9kZS5pZCA6XG4gICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoJ0Nhbm5vdCBkZWxldGUgbm9uLWV4aXN0aW5nIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICBxdWV1ZS5ub2RlLnN0b3AodHJ1ZSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHF1ZXVlLmRpc3BhdGNoZXI/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgcXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoXG4gICAgICB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSFcbiAgICApIGFzIEd1aWxkUXVldWU8VD47XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgfVxufSIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQge1xuICBDaGFubmVsVHlwZSxcbiAgR3VpbGQsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgVm9pY2VCYXNlZENoYW5uZWwsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXJCYW5kLFxuICBQQ01GaWx0ZXJzIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHtcbiAgdHlwZSBBdWRpb1BsYXllcixcbiAgQXVkaW9SZXNvdXJjZSxcbiAgU3RyZWFtVHlwZSxcbiAgVm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQge1xuICBJbnZhbGlkQXJnVHlwZUVycm9yLFxuICBOb1ZvaWNlQ2hhbm5lbEVycm9yLFxuICBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbiAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgZGVhZj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQcm9jZXNzZWRSZXN1bHQge1xuICBzdHJlYW06IFJlYWRhYmxlO1xuICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAoXG50cmFjazogVHJhY2ssXG5xdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSxcbnF1ZXVlOiBHdWlsZFF1ZXVlKVxuPT4gUHJvbWlzZTxSZWFkYWJsZSB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjxUID0gdW5rbm93bj4gPSAoXG5zdHJlYW06IFJlYWRhYmxlLFxucXVldWU6IEd1aWxkUXVldWUsXG50cmFjazogVHJhY2s8VD4pXG49PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja0FkZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrc0FkZDogJ2F1ZGlvVHJhY2tzQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKi9cbiAgQ29ubmVjdGlvbjogJ2Nvbm5lY3Rpb24nLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICovXG4gIENvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAqL1xuICBEaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKi9cbiAgRGVidWc6ICdkZWJ1ZycsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICovXG4gIEVycm9yOiAnZXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKi9cbiAgRW1wdHlRdWV1ZTogJ2VtcHR5UXVldWUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyRmluaXNoOiAncGxheWVyRmluaXNoJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIFBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKi9cbiAgUGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqL1xuICBWb2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICovXG4gIFZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgKi9cbiAgUGxheWVyUGF1c2U6ICdwbGF5ZXJQYXVzZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICovXG4gIFBsYXllclJlc3VtZTogJ3BsYXllclJlc3VtZScsXG4gIC8qKlxuICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICovXG4gIEJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICovXG4gIEVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gIC8qKlxuICAgKiBEU1AgdXBkYXRlXG4gICAqL1xuICBEU1BVcGRhdGU6ICdkc3BVcGRhdGUnLFxuICAvKipcbiAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICovXG4gIEF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBwbGF5ZXIgd2lsbCBwbGF5IG5leHQgdHJhY2tcbiAgICovXG4gIFdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICovXG4gIENoYW5uZWxQb3B1bGF0ZTogJ2NoYW5uZWxQb3B1bGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKi9cbiAgUXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBkZWxldGVkXG4gICAqL1xuICBRdWV1ZURlbGV0ZTogJ3F1ZXVlRGVsZXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICovXG4gIFdpbGxBdXRvUGxheTogJ3dpbGxBdXRvUGxheSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEd1aWxkUXVldWVFdmVudCA9XG4odHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrcyBhcnJheVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2tbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3RdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGVidWddOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBtZXNzYWdlOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgZXJyb3I6IEVycm9yLFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXJdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkVm9sdW1lOiBudW1iZXIsXG4gIG5ld1ZvbHVtZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLFxuICBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLFxuICBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EU1BVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sXG4gIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPVxuKHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGUpW2tleW9mIHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGVdO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZTxNZXRhID0gdW5rbm93bj4ge1xuICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAjZGVsZXRlZCA9IGZhbHNlO1xuICAjc2h1ZmZsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICBzdHJlYW0sXG4gICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgfSk7XG4gIHB1YmxpYyByZXBlYXRNb2RlOiBRdWV1ZVJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPilcbiAge1xuICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKVxuICAgIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpXG4gICAgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiZcbiAgICAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKVxuICAgIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYFxuICAgICk7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHF1ZXVlIGNhbiBpbnRlcmNlcHQgc3RyZWFtc1xuICAgKi9cbiAgcHVibGljIGNhbkludGVyY2VwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmXG4gICAgICAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0cyB0aGUgdHJhY2sgdG8gdGhlIGdpdmVuIGluZGV4XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMClcbiAgICovXG4gIHB1YmxpYyBpbnNlcnRUcmFjayh0cmFjazogVHJhY2ssIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuaW5zZXJ0KHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAqL1xuICBwdWJsaWMgbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUubW92ZSh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5VHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5jb3B5KHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gc3JjIFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgKi9cbiAgcHVibGljIHN3YXBUcmFja3Moc3JjOiBUcmFja1Jlc29sdmFibGUsIGRlc3Q6IFRyYWNrUmVzb2x2YWJsZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuc3dhcChzcmMsIGRlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzdHJlYW0gZGlzcGF0Y2hlciBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZURpc3BhdGNoZXIoXG4gIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgb3B0aW9uczogUGljazxWb2ljZUNvbm5lY3RDb25maWcsICdhdWRpb1BsYXllcicgfCAndGltZW91dCc+ID0ge30pXG4gIHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMuY2FjaGUuZ2V0KFxuICAgICAgY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCFcbiAgICApO1xuICAgIGlmICghY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDaGFubmVsRXJyb3IoKTtcbiAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnY2hhbm5lbCcsXG4gICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIGNoYW5uZWwsXG4gICAgICB0aGlzLFxuICAgICAgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCxcbiAgICAgIG9wdGlvbnMuYXVkaW9QbGF5ZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pXG4gIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbFJlc29sdmFibGUpO1xuICAgIGlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdjaGFubmVsJyxcbiAgICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYENvbm5lY3RpbmcgdG8gJHtcbiAgICAgIGNoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtcbiAgICAgIGNoYW5uZWwubmFtZX0gKElEOiAke2NoYW5uZWwuaWR9KWBcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlciAmJiBjaGFubmVsLmlkICE9PSB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbC5pZCkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0Rlc3Ryb3lpbmcgb2xkIGNvbm5lY3Rpb24nKTtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBxdWV1ZTogdGhpcyxcbiAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllcixcbiAgICAgIGdyb3VwOiBvcHRpb25zLmdyb3VwID8/IHRoaXMucGxheWVyLmNsaWVudC51c2VyPy5pZFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLiNhdHRhY2hMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBEeW5hbWljIHNodWZmbGluZyB3aWxsIHNodWZmbGUgdGhlIHF1ZXVlIHdoZW4gdGhlIGN1cnJlbnQgdHJhY2sgZW5kcywgd2l0aG91dCBtdXRhdGluZyB0aGUgcXVldWUuXG4gICAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgcXVldWUgd2lsbCBiZSBzaHVmZmxlZCBpbW1lZGlhdGVseSBpbi1wbGFjZSwgd2hpY2ggY2Fubm90IGJlIHVuZG9uZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVTaHVmZmxlKGR5bmFtaWMgPSB0cnVlKSB7XG4gICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLiNzaHVmZmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBkaXNhYmxlU2h1ZmZsZSgpIHtcbiAgICB0aGlzLiNzaHVmZmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHNodWZmbGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTaHVmZmxlKGR5bmFtaWMgPSB0cnVlKSB7XG4gICAgaWYgKGR5bmFtaWMpIHtcbiAgICAgIHRoaXMuI3NodWZmbGUgPSAhdGhpcy4jc2h1ZmZsZTtcbiAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzaHVmZmxlIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhpcyBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaHVmZmxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyLm5vZGVzLmRlbGV0ZSh0aGlzLmlkKSkge1xuICAgICAgdGhpcy4jZGVsZXRlZCA9IHRydWU7XG4gICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGUsIHRoaXMpO1xuICAgICAgdGhpcy5ub2RlLnRhc2tzUXVldWUuY2FuY2VsQWxsKCk7XG4gICAgICB0aGlzLnRhc2tzUXVldWUuY2FuY2VsQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHJldml2ZSgpIHtcbiAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICB0aGlzLiNkZWxldGVkID0gZmFsc2U7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBkZWFmXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXREZWFmKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGYgbXV0ZVxuICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0TXV0ZShtb2RlLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgYSB0cmFjayBpbiB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KFxuICB0cmFjazogVHJhY2tMaWtlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxNZXRhPilcbiAge1xuICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuXG4gICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhbiBldmVudCBvbiB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZW1pdFxuICAgKiBAcGFyYW0gYXJncyBUaGUgYXJncyBmb3IgdGhlIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgR3VpbGRRdWV1ZUV2ZW50czxNZXRhPj4oXG4gIGV2ZW50OiBLLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPEd1aWxkUXVldWVFdmVudHM8TWV0YT5bS10+KVxuICA6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgI2F0dGFjaExpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgZGlzcGF0Y2hlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5FcnJvciwgdGhpcywgZSkpO1xuICAgIGRpc3BhdGNoZXIub24oXG4gICAgICAnZGVidWcnLFxuICAgICAgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSlcbiAgICApO1xuICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdzdGFydCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtU3RhcnQocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignZHNwJywgKGYpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LmlzKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcUJhbmRzJywgKGYpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LmlzKGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIpKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCd2b2x1bWUnLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgIT09IGYpXG4gICAgICB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2UsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgIGZcbiAgICAgICk7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbiB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgdHlwZT86IFN0cmVhbVR5cGU7XG4gIGRhdGE6IFRyYWNrO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgcHVibGljIHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAjaW50ZXJjZXB0b3I6IEludGVyY2VwdGVkU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKVxuICB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAqL1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICovXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oXG4gICAgICAnZXJyb3InLFxuICAgICAgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKVxuICAgICk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycylcbiAgICAgIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKVxuICAgICAgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcnMpO1xuICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpXG4gICAgICB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICBuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiZcbiAgICAgIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNClcbiAgICAgIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLFxuICAgICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG5cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVuZCgpO1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHxcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmXG4gICAgICBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpXG4gICAgICB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wYXVzZWQgfHxcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgKi9cbiAgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cbiAgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAqL1xuICBpc0lkbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGlzY29ubmVjdGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgKi9cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgKi9cbiAgaXNTaWduYWxsaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICovXG4gIGlzQ29ubmVjdGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAqL1xuICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzOiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnMgP1xuICAgIHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgIGRzcDoge1xuICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgfSxcbiAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXIgP1xuICAgICAge1xuICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgIHRhcmdldFNhbXBsZVJhdGU6IG9wcz8uc2FtcGxlUmF0ZSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJlc2FtcGxlclxuICAgICAgfSxcbiAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgfSxcbiAgICAgIHZvbHVtZToge1xuICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICB9XG4gICAgfSkgOlxuICAgIHNyYztcblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUuXG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSwgb3BzPy5kYXRhKS5cbiAgICBjYXRjaChcbiAgICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICB9KSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0XG4gICAgKTtcblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdQcmVwYXJpbmcgQXVkaW9SZXNvdXJjZS4uLicpO1xuXG4gICAgY29uc3QgZm9ybWF0ID0gcG9zdFN0cmVhbT8udHlwZSA/PyBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnk7XG5cbiAgICBsZXQgX3N0cmVhbTogUmVhZGFibGU7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5jYW5JbnRlcmNlcHQoKSkge1xuICAgICAgdGhpcy4jaW50ZXJjZXB0b3IgPSBuZXcgSW50ZXJjZXB0ZWRTdHJlYW0oKTtcblxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW0pLnBpcGUodGhpcy4jaW50ZXJjZXB0b3IpO1xuXG4gICAgICBfc3RyZWFtID0gdGhpcy4jaW50ZXJjZXB0b3I7XG5cbiAgICAgIGF3YWl0IHRoaXMucXVldWUucGxheWVyLmhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgICAgb3BzPy5kYXRhLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHRoaXMuI2ludGVyY2VwdG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc3RyZWFtID0gcG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbTtcbiAgICB9XG5cbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKF9zdHJlYW0sIHtcbiAgICAgIGlucHV0VHlwZTogZm9ybWF0LFxuICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSBhcyBUcmFjayxcbiAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBzdHJlYW1cbiAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9BdWRpb1Jlc291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24sXG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LFxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgVHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybUNhbGxiYWNrLCB0eXBlIFdyaXRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW0gdGhhdCBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGNvbnN1bWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjb25zdW1lci5cbiAqIEBleGFtcGxlIGNvbnN0IHN0cmVhbSA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuICpcbiAqIC8vIHJlYWwgY29uc3VtZXJcbiAqIHN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCdmaWxlLnR4dCcpKTtcbiAqXG4gKiAvLyBtYW4gaW4gdGhlIG1pZGRsZSBjb25zdW1lclxuICogY29uc3QgbWFuSW5UaGVNaWRkbGUgPSBuZXcgV3JpdGFibGUoe1xuICogIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAqICAgY29uc29sZS5sb2coY2h1bmsudG9TdHJpbmcoKSk7XG4gKiAgIGNhbGxiYWNrKCk7XG4gKiAgfVxuICogfSk7XG4gKlxuICogLy8gc3RyZWFtLmludGVyY2VwdG9ycyBpcyBhIFNldCBvZiBXcml0YWJsZSBzdHJlYW1zXG4gKiBzdHJlYW0uaW50ZXJjZXB0b3JzLmFkZChtYW5JblRoZU1pZGRsZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRlZFN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnMgPSBuZXcgU2V0PFdyaXRhYmxlPigpO1xuICAjaW50ZXJjZXB0aW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3RhcnQgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2YgSW50ZXJjZXB0ZWRTdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc3RhcnRJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGludGVyY2VwdGluZyB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgY29uc3VtZWQgYnkgdGhlIGludGVyY2VwdG9ycy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGVtcG9yYXJpbHkgc3RvcCB0aGUgaW50ZXJjZXB0aW9uLiBUaGUgc3RvcHBlZCBzdGF0ZSBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIHN0YXJ0SW50ZXJjZXB0aW5nIGFnYWluLlxuICAgKi9cbiAgcHVibGljIHN0b3BJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RyZWFtIGlzIGJlaW5nIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgaXNJbnRlcmNlcHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVyY2VwdGluZztcbiAgfVxuXG4gIHB1YmxpYyBfdHJhbnNmb3JtKFxuICBjaHVuazogQnVmZmVyLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjaylcbiAgOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goY2h1bmssIGVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLiNpbnRlcmNlcHRpbmcgJiYgdGhpcy5pbnRlcmNlcHRvcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgY29uc3VtZXIud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmVuZCgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2Rlc3Ryb3koZXJyb3I6IEVycm9yLCBjYWxsYmFjazogVHJhbnNmb3JtQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVFcnJvciA9IFN0cmluZyhlcnJvcikuaW5jbHVkZXMoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJyk7XG4gICAgY29uc3QgZXJyID0gaWdub3JlRXJyb3IgPyB1bmRlZmluZWQgOiBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmRlc3Ryb3koZXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyY2VwdG9ycy5jbGVhcigpO1xuXG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufSIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuXG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59IiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vUmVzdWx0RXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICovXG4gIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgY3JlYXRlIHByb2dyZXNzIGJhciBmb3IgdGhlIHdob2xlIHF1ZXVlXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYmFyIGxlbmd0aFxuICAgKi9cbiAgbGVmdENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAqL1xuICByaWdodENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtYWluaW5nIHRpbWUgdHJhY2tcbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gICAqL1xuICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kaWNhdG9yXG4gICAqL1xuICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gIHF1ZXVlPzogYm9vbGVhbjtcbiAgc2Vlaz86IG51bWJlcjtcbiAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb247XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgY3VycmVudDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgdG90YWw6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgZGlzcGF0Y2hlckNvbmZpZzogQ3JlYXRlU3RyZWFtT3BzO1xuICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAjcHJvZ3Jlc3MgPSAwO1xuICAjaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gZmFsc2U7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IC9saWJvcHVzOiAoeWVzfHRydWUpLy50ZXN0KFxuICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuc2NhbkRlcHMoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgaXNJZGxlKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNJZGxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICovXG4gIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGF1c2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcHJvZ3Jlc3MgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICovXG4gIHB1YmxpYyBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnN0cmVhbVRpbWUgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHBsYXliYWNrIGR1cmF0aW9uIHdpdGggaGlzdG9yeSBpbmNsdWRlZFxuICAgKi9cbiAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuXG4gICAgdG9BcnJheSgpLlxuICAgIGZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnMuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgfSkuXG4gICAgZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggP1xuICAgIDEgOlxuICAgIG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/XG4gICAgdGhpcy5wbGF5YmFja1RpbWUgOlxuICAgIHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICB9LFxuICAgICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoY3VycmVudCAvIHRvdGFsICogMTAwKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJ1xuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJyxcbiAgICAgICAgU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICcwJyxcbiAgICAgICAgJ0Zpbml0ZSBOdW1iZXInXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoXG4gICAgICB0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aFxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKFxuICAgICAgICAgICcnXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgdGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7XG4gICAgICAgIHNlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KFxuICAgICAgICAgIGxlbmd0aCAtIDFcbiAgICAgICAgKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAgICdbZHVyYXRpb25dJyxcbiAgICAgICAgICBTdHJpbmcoZHVyYXRpb24pLFxuICAgICAgICAgICcwJyxcbiAgICAgICAgICBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKVxuICAgICAgICApLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24gPCAwKSBkdXJhdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdm9sdW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2b2x1bWVcbiAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYml0IHJhdGVcbiAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKFxuICAgICAgcmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhdXNlZCBzdGF0ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgc2V0UGF1c2VkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgY3VycmVudCB0cmFja1xuICAgKi9cbiAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgfTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIHJlYXNvbixcbiAgICAgIGRlc2NyaXB0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICogQHBhcmFtIGVtaXRFdmVudCBXaGV0aGVyIG9yIG5vdCB0byBlbWl0IHRoZSBldmVudCBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICBpZiAoZW1pdEV2ZW50KVxuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ3RyYWNrIHZhbHVlJyxcbiAgICAgICdpbnN0YW5jZSBvZiBUcmFjaycsXG4gICAgICBTdHJpbmcodHJhY2spXG4gICAgKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydClcbiAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICBpZiAoc3JjIDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgXG4gICAgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDBcbiAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgIG9wdGlvbnNcbiAgICApITtcblxuICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLidcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTm9SZXN1bHRFcnJvcihcbiAgICAgICAgJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCdcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3NpZ25lZFJlc291cmNlID0gdHJhY2sucmVzb3VyY2U7XG5cbiAgICAgIGlmIChhc3NpZ25lZFJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdUcmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2UgYXNzaWduZWQsIHBsYXllciB3aWxsIG5vdyBwbGF5IHRoZSByZXNvdXJjZSBkaXJlY3RseS4uLidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoXG4gICAgICBzcmMgPT09ICdzcG90aWZ5JyA/XG4gICAgICAnc3BvdGlmeVNvbmcnIDpcbiAgICAgIHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/XG4gICAgICAnYXBwbGVNdXNpY1NvbmcnIDpcbiAgICAgIHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLlxuICAgICAgdGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKVxuICAgICAgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuY29udGV4dC5wcm92aWRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICAgICAgICBicmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICB0aGlzLiNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrKS50aGVuKFxuICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHI/LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSA8UmVhZGFibGU+IHIucmVzdWx0O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHN0cmVhbVNyYy5lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGU6IEVycm9yKSA9PiBzdHJlYW1TcmMuZXJyb3IgPSBlXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gb3B0aW9ucy5zZWVrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFja1N0cmVhbUNvbmZpZzogU3RyZWFtQ29uZmlnID0ge1xuICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiB7XG4gICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/XG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6XG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJpcXVhZEZpbHRlcjpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgdm9sdW1lOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICAgICAgICAgIHNraXBGRm1wZWc6IHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZ1xuICAgICAgICB9LFxuICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlc29sdmVyID0gcmVzb2x2ZSk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLFxuICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICB0cmFjayxcbiAgICAgICAgdHJhY2tTdHJlYW1Db25maWcsXG4gICAgICAgIHJlc29sdmVyIVxuICAgICAgKTtcblxuICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8XG4gICAgICAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID1cbiAgICAgICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoXG4gICAgICAgIGZtdCBhcyBTdHJlYW1UeXBlXG4gICAgICApO1xuXG4gICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICBpZiAoXG4gICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiZcbiAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJlxuICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YFxuXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fFxuICAgICAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA6XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDBcbiAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICk7XG4gICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbFN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKFxuICAgICAgICAgIGZpbmFsU3RyZWFtLFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWdcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPVxuICAgIG5ldyBOb1Jlc3VsdEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApO1xuXG5cbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdC5tZXNzYWdlXG4gICAgKTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LFxuICAgICAgdHJhY2tcbiAgICApO1xuICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKG5leHRUcmFjaykgcmV0dXJuIHZvaWQgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVtaXQoJ2ZpbmlzaCcsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgI3BlcmZvcm1QbGF5KHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPVxuICAgIHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuZ2V0Q29udGV4dCgpPy5hdHRlbXB0ZWRFeHRyYWN0b3JzIHx8XG4gICAgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBzdHJlYW1JbmZvID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzLmFkZChleHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICB0cmFjay51cmwsXG4gICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgfSxcbiAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEdlbmVyaWMgc3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIGFuZCBmYWxsYmFjayBzdHJlYW0gZXh0cmFjdGlvbiBpcyBlbmFibGVkYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7XG4gICAgICB0cmFjay50aXRsZX0sIHVybDogJHtcbiAgICAgIHRyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrcyA9IGF3YWl0IGV4dHJhY3Rvci5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsXG4gIHRyYWNrOiBUcmFjayxcbiAgc2VlayA9IDAsXG4gIG9wdXM/OiBib29sZWFuKVxuICB7XG4gICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnXG4gICAgfSkuXG4gICAgb24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtcbiAgICAgICAgZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gXG5cbiAgICAgICk7XG5cbiAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgfVxufSIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgLyoqXG4gICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAqXG4gICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSxcbiAgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKVxuICB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzLCBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXIsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAge1xuICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgIH0sXG4gICAgKF8sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogYXJyW2ldID8gYXJyW2ldIC8gMzAgOiAwXG4gICAgfSlcbiAgKSBhcyBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG50eXBlIEVRUHJlc2V0ID0ge1xuICBGbGF0OiBFcXVhbGl6ZXJCYW5kW107XG4gIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICBDbHViOiBFcXVhbGl6ZXJCYW5kW107XG4gIERhbmNlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICBMYXJnZUhhbGw6IEVxdWFsaXplckJhbmRbXTtcbiAgTGl2ZTogRXF1YWxpemVyQmFuZFtdO1xuICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICBQb3A6IEVxdWFsaXplckJhbmRbXTtcbiAgUmVnZ2FlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgU2thOiBFcXVhbGl6ZXJCYW5kW107XG4gIFNvZnQ6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgVGVjaG5vOiBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG5leHBvcnQgY29uc3QgRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDogUmVhZG9ubHk8RVFQcmVzZXQ+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gIENsYXNzaWNhbDogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl1cbiAgKSxcbiAgQ2x1YjogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDguMCwgNS42LCA1LjYsIDUuNiwgMy4yLCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XVxuICApLFxuICBEYW5jZTogbWFrZUJhbmRzKFtcbiAgOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1XVxuICApLFxuICBGdWxsQmFzczogbWFrZUJhbmRzKFtcbiAgLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXVxuICApLFxuICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFtcbiAgNy4yLCA1LjYsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTQuOCwgMS42LCA4LjAsIDExLjIsIDEyLjAsIDEyLjBdXG4gICksXG4gIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbXG4gIC05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF1cbiAgKSxcbiAgSGVhZHBob25lczogbWFrZUJhbmRzKFtcbiAgNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdXG4gICksXG4gIExhcmdlSGFsbDogbWFrZUJhbmRzKFtcbiAgMTAuNCwgMTAuNCwgNS42LCA1LjYsIC0xLjExMDIyZS0xNSwgLTQuOCwgLTQuOCwgLTQuOCwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICBQYXJ0eTogbWFrZUJhbmRzKFtcbiAgNy4yLCA3LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDcuMiwgNy4yXVxuICApLFxuICBQb3A6IG1ha2VCYW5kcyhbXG4gIC0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XVxuICApLFxuICBSZWdnYWU6IG1ha2VCYW5kcyhbXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC0xLjExMDIyZS0xNSwgNi40LCA2LjQsXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gIFNrYTogbWFrZUJhbmRzKFtcbiAgLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl1cbiAgKSxcbiAgU29mdDogbWFrZUJhbmRzKFtcbiAgNC44LCAxLjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTEuMTEwMjJlLTE1LCA0LjAsIDguMCwgOS42LCAxMS4yLCAxMi4wXVxuICApLFxuICBTb2Z0Um9jazogbWFrZUJhbmRzKFtcbiAgNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XVxuICApLFxuICBUZWNobm86IG1ha2VCYW5kcyhbXG4gIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XVxuICApXG59KTtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmZm1wZWcgbWF5IGJlIHNraXBwZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2tpcHBhYmxlKCkge1xuICAgIHJldHVybiAhIXRoaXMuYWYucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIGNvbnN0IHsgcXVldWUgfSA9IHRoaXMuYWY7XG4gICAgLy8gc2tpcCBpZiBmaWx0ZXJzIGFyZSB0aGUgc2FtZVxuICAgIGlmIChcbiAgICBmaWx0ZXJzLmV2ZXJ5KChmKSA9PiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGYpKSAmJlxuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuZXZlcnkoKGYpID0+IGZpbHRlcnMuaW5jbHVkZXMoZikpKVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgY29uc3QgaWdub3JlRmlsdGVycyA9XG4gICAgdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJlxuICAgICFmaWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKTtcbiAgICBjb25zdCBzZWVrVGltZSA9IHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMpPy5jdXJyZW50LnZhbHVlIHx8IDA7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gWy4uLm5ldyBTZXQoZmlsdGVycyldO1xuXG4gICAgcmV0dXJuIHRoaXMuYWYudHJpZ2dlclJlcGxheShzZWVrVGltZSkudGhlbigodCkgPT4ge1xuICAgICAgcXVldWUuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZSxcbiAgICAgICAgcXVldWUsXG4gICAgICAgIHByZXYsXG4gICAgICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICovXG4gIHB1YmxpYyBzZXRJbnB1dEFyZ3MoYXJnczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWFyZ3MuZXZlcnkoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdhcmdzJywgJ0FycmF5PHN0cmluZz4nLCAnaW52YWxpZCBpdGVtKHMpJyk7XG4gICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dEFyZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lucHV0QXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW5jb2RlciBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgIGlmICghdGhpcy5maWx0ZXJzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIFsnLWFmJywgdGhpcy50b1N0cmluZygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmluYWwgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dEFyZ3MuY29uY2F0KHRoaXMuZW5jb2RlckFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHN0cmVhbSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jaW5wdXRBcmdzLmxlbmd0aClcbiAgICBvcHRpb25zLmVuY29kZXJBcmdzID0gW1xuICAgIC4uLnRoaXMuI2lucHV0QXJncyxcbiAgICAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuXG5cbiAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVGRm1wZWdTdHJlYW0oc291cmNlLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICAvKipcbiAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgc2V0RmlsdGVycyhcbiAgZmlsdGVyczogRmlsdGVyc1tdIHwgUmVjb3JkPEZpbHRlcnMsIGJvb2xlYW4+IHwgc3RyaW5nW10gfCBib29sZWFuKVxuICB7XG4gICAgbGV0IF9maWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICBpZiAodHlwZW9mIGZpbHRlcnMgPT09ICdib29sZWFuJykge1xuICAgICAgX2ZpbHRlcnMgPSAhZmlsdGVycyA/XG4gICAgICBbXSA6XG4gICAgICBPYmplY3Qua2V5cyhBdWRpb0ZpbHRlcnMuZmlsdGVycykgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzIGFzIEZpbHRlcnNbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKS5cbiAgICAgIGZpbHRlcigocmVzKSA9PiByZXNbMV0gPT09IHRydWUpLlxuICAgICAgbWFwKChtKSA9PiBtWzBdKSBhcyBGaWx0ZXJzW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoX2ZpbHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSBhY3RpdmUgZmZtcGVnIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLnNldEZpbHRlcnMoZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGdpdmVuIGZmbXBlZyBmaWx0ZXIocylcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcihzKVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZShmaWx0ZXJzOiBGaWx0ZXJzW10gfCBGaWx0ZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgIGNvbnN0IGZyZXNoOiBGaWx0ZXJzW10gPSBbXTtcblxuICAgIGZpbHRlcnMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5pbmNsdWRlcyhmKSkgcmV0dXJuO1xuICAgICAgZnJlc2gucHVzaChmKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKFxuICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5maWx0ZXIoKHIpID0+ICFmaWx0ZXJzLmluY2x1ZGVzKHIpKS5jb25jYXQoZnJlc2gpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmZiBGaWx0ZXJzIGxpc3RcbiAgICovXG4gIHB1YmxpYyBzZXREZWZhdWx0cyhmZjogRmlsdGVyc1tdKSB7XG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaXN0IG9mIGRpc2FibGVkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5uYW1lcy5maWx0ZXIoKGYpID0+ICF0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGYpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGVuYWJsZWRcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZGlzYWJsZWRcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAqL1xuICBwdWJsaWMgaXNEaXNhYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHRlc3RcbiAgICovXG4gIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLmhhcyhmaWx0ZXIgYXMgRmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gYXJyYXlcbiAgICovXG4gIHB1YmxpYyB0b0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgY29uc3Qgb2JqID0ge30gYXMgUmVjb3JkPGtleW9mIFF1ZXVlRmlsdGVycywgc3RyaW5nPjtcblxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IG9ialtmaWx0ZXJdID0gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuY3JlYXRlKHRoaXMuZmlsdGVycyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlQUZpbHRlcnNDYWNoZSB7XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGEgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBncmFwaCA9IG5ldyBBRmlsdGVyR3JhcGg8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBlcXVhbGl6ZXJQcmVzZXRzID0gRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDtcbiAgcHVibGljIF9sYXN0RmlsdGVyc0NhY2hlOiBHdWlsZFF1ZXVlQUZpbHRlcnNDYWNoZSA9IHtcbiAgICBiaXF1YWQ6IG51bGwsXG4gICAgZXF1YWxpemVyOiBbXSxcbiAgICBmaWx0ZXJzOiBbXSxcbiAgICB2b2x1bWU6IDEwMCxcbiAgICBzYW1wbGVSYXRlOiAtMVxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5IGN1cnJlbnQgdHJhY2sgaW4gdHJhbnNpdGlvbiBtb2RlXG4gICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJpZ2dlclJlcGxheShzZWVrID0gMCkge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodGhpcy5xdWV1ZS5jdXJyZW50VHJhY2ssIHtcbiAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICBzZWVrLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZmbXBlZz8uZmlsdGVycyA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiAodGhpcy5hZi5lcXVhbGl6ZXI/LmJhbmRNdWx0aXBsaWVycyB8fCBbXSkubWFwKChtLCBpKSA9PiAoe1xuICAgICAgYmFuZDogaSxcbiAgICAgIGdhaW46IG1cbiAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWYuYmlxdWFkPy5nZXRGaWx0ZXJOYW1lKCkgYXMgRXhjbHVkZTxcbiAgICAgICAgQmlxdWFkRmlsdGVycyxcbiAgICAgICAgbnVtYmVyPiB8XG4gICAgICBudWxsIHx8IG51bGwpO1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnZvbHVtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBkdW1wKCk6IEZpbHRlckdyYXBoIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgIHRoaXMucmVzYW1wbGVyPy50YXJnZXRTYW1wbGVSYXRlIHx8IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcmFwaCB7XG4gIGZmbXBlZzogRmlsdGVyc1tdO1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59IiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcsIGNyZWF0ZUZGbXBlZ0FyZ3MgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1NUUklORyhcbnN0cmVhbTogc3RyaW5nLFxuZm10Pzogc3RyaW5nLFxuY29va2llcz86IHN0cmluZylcbntcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIHJlY29ubmVjdDogMSxcbiAgICByZWNvbm5lY3Rfc3RyZWFtZWQ6IDEsXG4gICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICBpOiBzdHJlYW0sXG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICBjb29raWVzOlxuICAgIHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/XG4gICAgIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/XG4gICAgY29va2llcyA6XG4gICAgYFwiJHtjb29raWVzfVwiYCA6XG4gICAgbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKFxuc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZyxcbm9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKVxuOiBSZWFkYWJsZSB7XG4gIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICBvcHRpb25zID8/PSB7fTtcbiAgY29uc3QgYXJncyA9XG4gIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID9cbiAgRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOlxuICBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6XG4gICAgICB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gIW0udXNlci5ib3RcbiAgICAgICkuc2l6ZSB8fCAwLFxuICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgcGxheWVyOiB0aGlzLnF1ZXVlLnBsYXllci52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICB9XG59IiwgImltcG9ydCB7IE5vdEV4aXN0aW5nRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7dGltZXN0YW1wOiBudW1iZXI7bGluZTogc3RyaW5nO307XG5cbmNvbnN0IHRpbWVzdGFtcFBhdHRlcm4gPSAvXFxbKFxcZHsyfSk6KFxcZHsyfSlcXC4oXFxkezJ9KVxcXS87XG5cbmV4cG9ydCBjbGFzcyBTeW5jZWRMeXJpY3NQcm92aWRlciB7XG4gICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICNvblVuc3Vic2NyaWJlOiBVbnN1YnNjcmliZSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdClcbiAge1xuICAgIGlmIChyYXc/LnN5bmNlZEx5cmljcykgdGhpcy5sb2FkKHJhdz8uc3luY2VkTHlyaWNzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGxvYWQobHlyaWNzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWx5cmljcykgdGhyb3cgbmV3IE5vdEV4aXN0aW5nRXJyb3IoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgdGhpcy5seXJpY3MuY2xlYXIoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aW1lc3RhbXBQYXR0ZXJuKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID1cbiAgICAgICAgcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLnNldCh0aW1lc3RhbXAsIGxpbmUucmVwbGFjZSh0aW1lc3RhbXBQYXR0ZXJuLCAnJykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGxvd2VzdFRpbWUgPT0gbnVsbCB8fCB0aW1lIDwgbG93ZXN0VGltZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSlcbiAgICByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+XG4gICAgTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGFcbiAgICApO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgbGFzdFZhbHVlICE9PSBudWxsICYmXG4gICAgICBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiZcbiAgICAgIGx5cmljcy50aW1lc3RhbXAgPT09IGxhc3RWYWx1ZS50aW1lc3RhbXApXG5cbiAgICAgIHJldHVybjtcblxuICAgICAgbGFzdFZhbHVlID0gbHlyaWNzO1xuXG4gICAgICB0aGlzLiNjYWxsYmFjayhseXJpY3MubGluZSwgbHlyaWNzLnRpbWVzdGFtcCk7XG4gICAgfSwgdGhpcy5pbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxufSIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgcHVibGljIGxpbWl0ID0gMTtcbiAgcHVibGljIHJlbWFpbmluZyA9IDE7XG4gIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgcHVibGljIHF1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIE1BWF9SRVRSSUVTID0gNTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBidWNrZXQgaXMgcmF0ZSBsaW1pdGVkLlxuICAgKi9cbiAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nIDw9IDAgJiYgRGF0ZS5ub3coKSA8IHRoaXMucmVzZXRBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVucXVldWUocmVxOiBSZXF1ZXN0RW50aXR5KSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLmFjcXVpcmUoKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW50cnkucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3QocmVxOiBSZXF1ZXN0RW50aXR5LCByZXRyaWVzID0gMCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICB3aGlsZSAodGhpcy5pc1JhdGVMaW1pdGVkKCkpIHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgIH1cblxuICAgIGxldCBwYXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxKCk7XG5cbiAgICAgIHRoaXMuX3BhdGNoSGVhZGVycyhyZXMpO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keToge1xuICAgICAgICAgICAgY29kZTogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgIH0gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHtjb2RlOiBudW1iZXI7fTtcblxuICAgICAgICAgIGVycm9yLm5hbWUgPSBib2R5Lm5hbWU7XG4gICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoYEhUVFAgRXJyb3I6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhc3MgPSB0cnVlO1xuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocGFzcykgdGhyb3cgZTtcblxuICAgICAgY29uc3QgYmFkUmVxID0gZSBpbnN0YW5jZW9mIEVycm9yICYmIC9FcnJvcjogNFswLTldezJ9Ly50ZXN0KGUubWVzc2FnZSk7XG5cbiAgICAgIGlmICghYmFkUmVxICYmIHJldHJpZXMgPCB0aGlzLk1BWF9SRVRSSUVTKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSwgKytyZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKSk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJykpO1xuICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPVxuICAgIE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKFxuICAgICAgL1tBLVpdL2csXG4gICAgICAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PlxubmV3IFVSTFNlYXJjaFBhcmFtcyh0b1NuYWtlQ2FzZShwYXJhbXMpKS50b1N0cmluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICB0cmFja05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwbGFpbkx5cmljczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHN5bmNlZEx5cmljcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTHJjR2V0UmVzdWx0ID0gT21pdDxMcmNTZWFyY2hSZXN1bHQsICduYW1lJz47XG5cbmV4cG9ydCBjbGFzcyBMcmNMaWIge1xuICAvKipcbiAgICogVGhlIEFQSSBVUkxcbiAgICovXG4gIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCB0aW1lb3V0LiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgdGltZW91dCA9IDE1XzAwMDtcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgKi9cbiAgcHVibGljIGJ1Y2tldCA9IG5ldyBTZXF1ZW50aWFsQnVja2V0KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTHJjTGliIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmV0cnkgbGltaXQuIERlZmF1bHQgaXMgNS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgKi9cbiAgcHVibGljIHNldFJldHJ5TGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVja2V0Lk1BWF9SRVRSSUVTID0gbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzIGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0QnlJZChpZDogYCR7bnVtYmVyfWAgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4oYGdldC8ke2lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2FjaGVkIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVkKHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChwYXJhbXM6IExyY1NlYXJjaFBhcmFtcykge1xuICAgIGlmICghcGFyYW1zLnEgJiYgIXBhcmFtcy50cmFja05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdFtdPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgQVBJXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gVXRpbC5nZXRSdW50aW1lKCk7XG5cbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID1cbiAgICAgIG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRoaXMudGltZW91dCksXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IGBEaXNjb3JkLVBsYXllci8ke3RoaXMucGxheWVyLnZlcnNpb259ICR7XG4gICAgICAgICAgcnVudGltZVZlcnNpb24gPz8gJyd9YC5cbiAgICAgICAgICB0cmltRW5kKCksXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBbTHJjTGliXSBSZXF1ZXN0aW5nICR7cGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCxcbiAgICAgICAgaW5pdFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5idWNrZXQuZW5xdWV1ZShkaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiByZXMuanNvbigpO1xuICB9XG59IiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIEF1ZGlvUGxheWVyIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gIC8qKlxuICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248XG4gICAgU25vd2ZsYWtlLFxuICAgIFN0cmVhbURpc3BhdGNoZXI+KFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAgOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoKTtcbiAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubixcbiAgICAgIGNoYW5uZWwsXG4gICAgICBvcHRpb25zLnF1ZXVlLFxuICAgICAgb3B0aW9ucy5tYXhUaW1lLFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gICAgcmV0dXJuIHN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW4oXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIG9wdGlvbnM/Lmdyb3VwXG4gICAgKTtcblxuICAgIGlmIChcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQuXG4gICAgICB2b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpXG4gICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy9cbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICovXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTsiLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICB9KVxuICB7XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxuICAgICAgdGhpcy5jbGVhbnVwLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNoZWNrSW50ZXJ2YWxcbiAgICApLnVucmVmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICBpZiAoIXJlc3VsdClcbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIGRhdGE6IFQsXG4gIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKVxuICB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fFxuICAgIGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8XG4gICAgdGhpcy5leHBpcmVBZnRlciA8IDEpXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICBxdWVyeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn0iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXlsaXN0LFxuICBUcmFjayxcbiAgU2VhcmNoUmVzdWx0LFxuICBTZWFyY2hPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhIH0gZnJvbVxuJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbVxuJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUXVlcnlSZXNvbHZlcixcbiAgUXVlcnlUeXBlLFxuICBSZXNvbHZlZFF1ZXJ5LFxuICBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tXG4nLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgQXVkaW9SZXNvdXJjZSxcbiAgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uLFxuICBTdHJlYW1UeXBlIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUsIFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IsIE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5pbXBvcnQgeyBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yIH0gZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyBkcFZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24nO1xuaW1wb3J0IHtcbiAgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IsXG4gIHR5cGUgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3JPcHRpb25zIH0gZnJvbVxuJy4vUGxheWVyU3RyZWFtSW50ZXJjZXB0b3InO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICBlcnJvcjogKGVycm9yOiBFcnJvcikgPT4gYW55O1xuICB2b2ljZVN0YXRlVXBkYXRlOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgbmV3U3RhdGU6IFZvaWNlU3RhdGUpXG4gID0+IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IFBsYXllckV2ZW50ID0ge1xuICBkZWJ1ZzogJ2RlYnVnJyxcbiAgRGVidWc6ICdkZWJ1ZycsXG4gIGVycm9yOiAnZXJyb3InLFxuICBFcnJvcjogJ2Vycm9yJyxcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICBWb2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZSdcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbGF5ZXJFdmVudCA9ICh0eXBlb2YgUGxheWVyRXZlbnQpW2tleW9mIHR5cGVvZiBQbGF5ZXJFdmVudF07XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID1cbnN0cmluZyB8XG5UcmFjayB8XG5TZWFyY2hSZXN1bHQgfFxuVHJhY2tbXSB8XG5QbGF5bGlzdCB8XG5BdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbXG4gIEd1aWxkUXVldWVFdmVudC5FcnJvcixcbiAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXVxuICApO1xuICAvKipcbiAgICogVGhlIHBsYXllciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAvKipcbiAgICogVGhlIGx5cmljcyBhcGlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBseXJpY3MgPSBuZXcgTHJjTGliKHRoaXMpO1xuXG4gICNzdHJlYW1JbnRlcmNlcHRvcjogUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGBcbiAgICAgICk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAnY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JyxcbiAgICAgICAgICAgICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgP1xuICAgICAgbnVsbCA6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmXG4gICAgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKVxuICAgIHtcbiAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgdGhpcy4jbGFnTW9uaXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9LCAwKS51bnJlZigpO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVycmlkZUZhbGxiYWNrQ29udGV4dCkge1xuICAgICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0BbcGxheWVyXScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9va3MgY29udGV4dCBmb3IgdGhpcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLiNob29rc0N0eCkge1xuICAgICAgdGhpcy4jaG9va3NDdHggPSBjcmVhdGVDb250ZXh0KCk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsUHJvdmlkZXIgPSB0aGlzLiNob29rc0N0eC5wcm92aWRlLmJpbmQodGhpcy4jaG9va3NDdHgpO1xuXG4gICAgICB0aGlzLiNob29rc0N0eC5wcm92aWRlID0gKHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgICAgICByZXR1cm4gU1VQRVJfQ09OVEVYVC5wcm92aWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm92aWRlcih2YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jaG9va3NDdHg7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBkaXNjb3JkLXBsYXllciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlDYWNoZSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIGBQbGF5ZXIubm9kZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRzID0gcGxheWVyLmdlbmVyYXRlU3RhdGlzdGljcygpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAqXG4gICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICogLy8ge1xuICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAqIC8vICAgcXVldWVzOiBbXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgLi4uXG4gICAqIC8vICAgXVxuICAgKiAvLyB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGxheWVyIGlzIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gQ29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgd2hlbiBub24tZGlzY29yZC5qcyBjbGllbnQgaXMgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBpc0NvbXBhdE1vZGUoKSB7XG4gICAgcmV0dXJuIGlzQ2xpZW50UHJveHkodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29tcGF0TW9kZSgpKSB7XG4gICAgICB0aGlzLmNsaWVudC5vZmYoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICB0aGlzLmNsaWVudC5kZWNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9yVGltZW91dCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9yVGltZW91dCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICBxdWV1ZSxcbiAgICAgIG9sZFN0YXRlLFxuICAgICAgbmV3U3RhdGVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICogfSBjYXRjaChlKSB7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgcXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgJ1ZvaWNlQmFzZWRDaGFubmVsJyxcbiAgICAgICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YFxuICAgICk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9XG4gICAgcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPVxuICAgIChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoXG4gICAgICAgIGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtcbiAgICAgICAgcmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYFxuXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gV2FpdGluZyBmb3IgdGhlIHF1ZXVlIHRvIHJlc29sdmUuLi5gKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKVxuICAgICAgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHF1ZXVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdHJhY2tzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAqXG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KVxuICA6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gc2VhcmNoUXVlcnk7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICBzZWFyY2hRdWVyeSA9IHRoaXMuY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShzZWFyY2hRdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbClcbiAgICBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGRldGVjdGVkIGluIHF1ZXJ5YCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlLmZpbmQoXG4gICAgICAgIChlKSA9PlxuICAgICAgICAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJlxuICAgICAgICBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdFeHRyYWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYFxuICAgICAgICApO1xuICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGFuIGV4dHJhY3RvciB0aGF0IHN1cHBvcnRzICR7cHJvdG9jb2xOYW1lfSBwcm90b2NvbC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuLi5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RlZCA9IGF3YWl0IFF1ZXJ5UmVzb2x2ZXIucHJlUmVzb2x2ZShzZWFyY2hRdWVyeSk7XG4gICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/XG4gICAgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDpcbiAgICB7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke1xuICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID9cbiAgICAgICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDpcbiAgICAgICcnfWBcblxuICAgICk7XG5cbiAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgZXh0cmFjdG9yID1cbiAgICAgIChcbiAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgIH0pKT8uXG4gICAgICBleHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gXG4gICAgKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICAnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICFvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpICYmIChcbiAgICAgIGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICBwcm90b2NvbFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke1xuICAgICAgICByZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYFxuXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgfSk7XG5cbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgIGNvbnN0IHJ1bnRpbWUgPVxuICAgICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICBsaW5lLFxuICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgdGhpcy5pc0NvbXBhdE1vZGUoKSA/XG4gICAgYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOlxuICAgICcnfWAsXG5cbiAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgIGAtIE5vZGUgdmVyc2lvbjogJHtwcm9jZXNzLnZlcnNpb259IChEZXRlY3RlZCBSdW50aW1lOiAke3J1bnRpbWV9LCBQbGF0Zm9ybTogJHtwcm9jZXNzLnBsYXRmb3JtfSBbJHtwcm9jZXNzLmFyY2h9XSlgLFxuICAgICgoKSA9PiB7XG4gICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgYC0gZmZtcGVnOiAke2luZm8udmVyc2lvbn1gLFxuICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgIGAtIHN0YXRpYzogJHtpbmZvLm1vZHVsZX1gLFxuICAgICAgYC0gbGlib3B1czogJHtpbmZvLnJlc3VsdCEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5cbiAgICAgIGpvaW4oJ1xcbicpO1xuICAgIH0pKCksXG4gICAgJ1xcbicsXG4gICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgbGluZSxcbiAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgIH0pLlxuICAgIGpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVTdHJpbmcoKV07XG5cblxuICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYWNrIGZyb20gYW4gYXVkaW8gcmVzb3VyY2UuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSAocmVzb3VyY2UubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJlZiA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1heWJlVGl0bGUgPVxuICAgICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPVxuICAgICdhdXRob3InIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuYXV0aG9yfWAgOiAnVW5rbm93biBhdXRob3InO1xuICAgIGNvbnN0IG1heWJlRHVyYXRpb24gPVxuICAgICdkdXJhdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kdXJhdGlvbn1gIDogJzAwOjAwJztcbiAgICBjb25zdCBtYXliZVRodW1ibmFpbCA9XG4gICAgJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9XG4gICAgJ3VybCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS51cmx9YCA6IGBkaXNjb3JkLXBsYXllcjovL2Jsb2IvJHtyZWZ9YDtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID1cbiAgICAnZGVzY3JpcHRpb24nIGluIG1ldGFkYXRhID9cbiAgICBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDpcbiAgICAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLic7XG4gICAgY29uc3QgbWF5YmVWaWV3cyA9ICd2aWV3cycgaW4gbWV0YWRhdGEgPyBOdW1iZXIobWV0YWRhdGEudmlld3MpIHx8IDAgOiAwO1xuXG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywge1xuICAgICAgdGl0bGU6IG1heWJlVGl0bGUsXG4gICAgICBhdXRob3I6IG1heWJlQXV0aG9yLFxuICAgICAgZHVyYXRpb246IG1heWJlRHVyYXRpb24sXG4gICAgICB0aHVtYm5haWw6IG1heWJlVGh1bWJuYWlsLFxuICAgICAgdXJsOiBtYXliZVVSTCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtYXliZURlc2NyaXB0aW9uLFxuICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQixcbiAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgdmlld3M6IG1heWJlVmlld3NcbiAgICB9KTtcblxuICAgIHJlc291cmNlLm1ldGFkYXRhID0gdHJhY2s7XG5cbiAgICB0cmFjay5zZXRSZXNvdXJjZShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbnRlcmNlcHRpbmcgc3RyZWFtc1xuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gaW50ZXJjZXB0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgdHJhY2s6IFRyYWNrLFxuICBmb3JtYXQ6IFN0cmVhbVR5cGUsXG4gIHN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG4gIHtcbiAgICBpZiAoIXRoaXMuI3N0cmVhbUludGVyY2VwdG9yKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IuaGFuZGxlKHF1ZXVlLCB0cmFjaywgZm9ybWF0LCBzdHJlYW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnbG9iYWwgc3RyZWFtIGludGVyY2VwdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gaW50ZXJjZXB0b3Igb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbUludGVyY2VwdG9yKG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICAgIH1cblxuICAgIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yID0gbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgfHwgIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKVxuICAgIHJldHVybjtcbiAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke2d1aWxkSWR9YCwgdGltZW91dCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5ndWlsZElkOiBzdHJpbmcpXG57XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZyhcbiAgICAgICAgJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoXG4gIG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChcbiAgaXNCb3RTdGF0ZSAmJlxuICBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgKFxuICAhb2xkU3RhdGUuY2hhbm5lbElkIHx8IG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSlcbiAge1xuICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjaGFubmVsIGVtcHR5L3BvcHVsYXRlIGV2ZW50c1xuICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIGlmIChcbiAgICBuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQgJiZcbiAgICAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpXG5cbiAgICByZXR1cm47XG4gICAgaWYgKCFxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7Z3VpbGRJZH1gKSkge1xuICAgICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWF5YmVOdWxsPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgY29yZToge1xuICAgICdkaXNjb3JkLXBsYXllcic6IHN0cmluZztcbiAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICB9O1xuICBsaWJvcHVzOiB7XG4gICAgbWVkaWFwbGV4OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICBvcHVzc2NyaXB0OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGxpYnNvZGl1bToge1xuICAgICdzb2RpdW0tbmF0aXZlJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQG5vYmVsL2NpcGhlcnMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgfTtcbiAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgRkZtcGVnTGliLFxuICBNYXliZU51bGw8e1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICB9Pj47XG5cblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICogQHJldHVybnMgVGhlIHBhY2thZ2UuanNvbiBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZmluZFBhY2thZ2VKU09OKFxuICBkaXI6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZGVwdGg6IG51bWJlcilcbiAgOiBQYWNrYWdlSlNPTiB8IG51bGwge1xuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgY29uc3QgbmV4dCA9ICgpID0+XG4gICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oXG4gICAgICByZXNvbHZlKGRpciwgJy4uJyksXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGRlcHRoIC0gMVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IHBrZ0pTT046IFBhY2thZ2VKU09OID0gcmVxdWlyZSh0YXJnZXQpO1xuXG4gICAgICBpZiAocGtnSlNPTi5uYW1lICE9PSBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGtnSlNPTjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogVHJpZXMgdG8gZmluZCB0aGUgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHBhY2thZ2UgdG8gZmluZCB0aGUgdmVyc2lvbiBvZlxuICAgKiBAcGFyYW0gbWF4TG9va3VwRGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2ggZm9yIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgKiBAcmV0dXJucyBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHZlcnNpb24obmFtZTogc3RyaW5nLCBtYXhMb29rdXBEZXB0aCA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkaXNjb3JkLXBsYXllcicpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBrZyA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1heExvb2t1cERlcHRoXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBrZz8udmVyc2lvbiA/PyBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVwb3J0IG9iamVjdFxuICAgKi9cbiAgZ2VuZXJhdGUoKTogRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgICBjb25zdCBmZm1wZWdSZXBvcnQgPSB7fSBhcyBGRm1wZWdSZXBvcnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBGRm1wZWcuc291cmNlcykge1xuICAgICAgZmZtcGVnUmVwb3J0W2xpYi5uYW1lXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmZtcGVnID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG5cbiAgICBpZiAoZmZtcGVnKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbZmZtcGVnLm5hbWVdID0ge1xuICAgICAgICBoYXNMaWJvcHVzOiBmZm1wZWcuY29tbWFuZC5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpLFxuICAgICAgICB2ZXJzaW9uOiBmZm1wZWcudmVyc2lvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29yZToge1xuICAgICAgICAnZGlzY29yZC1wbGF5ZXInOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJ1xuICAgICAgICApIGFzIHN0cmluZyxcbiAgICAgICAgJ2Rpc2NvcmQtdm9pcCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnZGlzY29yZC12b2lwJ1xuICAgICAgICApIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6XG4gICAgICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1J1xuICAgICAgICApLFxuICAgICAgICAnc29kaXVtLWphdmFzY3JpcHQnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bS1qYXZhc2NyaXB0JyksXG4gICAgICAgICdAbm9iZWwvY2lwaGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQG5vYmVsL2NpcGhlcnMnKVxuICAgICAgfSxcbiAgICAgIGZmbXBlZzogZmZtcGVnUmVwb3J0XG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgb3V0cHV0LnB1c2goJ0RlcGVuZGVuY2llcyBSZXBvcnQnKTtcbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICBmb3IgKGNvbnN0IF9rZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qga2V5ID0gX2tleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQ7XG5cbiAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cbiAgICAgIGNvbnN0IHN1YktleXMgPSBPYmplY3Qua2V5cyhyZXBvcnRba2V5XSk7XG5cbiAgICAgIGZvciAoY29uc3QgX3N1YktleSBvZiBzdWJLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSc7XG5cbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYC0gJHtzdWJLZXl9OiAke1xuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiB2YWx1ZX1gXG5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cblxuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxufTsiLCAiXG5cblxuXG5cblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAvKiBAX19NQUNST19fIGdldFZlcnNpb24gKi9cIjcuMS4wXCI7IiwgImltcG9ydCB7IFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHR5cGUgeyBUcmFjayB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG50eXBlIEF3YWl0YWJsZTxUPiA9IFQgfCBQcm9taXNlTGlrZTxUPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNob3VsZEludGVyY2VwdEZ1bmN0aW9uID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPGJvb2xlYW4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIgPSA8VCA9IGFueT4oXG5xdWV1ZTogR3VpbGRRdWV1ZTxUPixcbnRyYWNrOiBUcmFjayxcbmZvcm1hdDogU3RyZWFtVHlwZSxcbnN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG49PiBBd2FpdGFibGU8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbnRlcmNlcHRlZC5cbiAgICovXG4gIHNob3VsZEludGVyY2VwdD86IFNob3VsZEludGVyY2VwdEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3Ige1xuICAjb25TdHJlYW0gPSBuZXcgU2V0PE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLFxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucylcbiAge31cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgaW50ZXJjZXB0ZWQgc3RyZWFtLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIGd1aWxkIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW50ZXJjZXB0ZWQgc3RyZWFtXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGU8VCA9IHVua25vd24+KFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPixcbiAgdHJhY2s6IFRyYWNrLFxuICB0eXBlOiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICA6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5zaG91bGRJbnRlcmNlcHQ7XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaWx0ZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLiNvblN0cmVhbS5zaXplO1xuXG4gICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMuI29uU3RyZWFtXS5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGludGVyY2VwdGVkIHN0cmVhbSBsaXN0ZW5lci5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXJcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW0oaGFuZGxlcjogT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLiNvblN0cmVhbS5hZGQoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy4jb25TdHJlYW0uZGVsZXRlKGhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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TSxhQUFjLEdBQUssS0FBSyxLQUFLLEtBQUssR0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDNUUsT0FBTztBQUFBLElBQVU7QUFBQSxNQUNqQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFDcEQ7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQUs7QUFBQSxJQUFHO0FBQUEsRUFDcEM7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLElBQUk7QUFBQSxFQUM5RDtBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQVU7QUFBQSxNQUNsQjtBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1BQ25FO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxJQUFZO0FBQUEsRUFDeEM7QUFBQSxFQUNBLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLElBQUc7QUFBQSxFQUM3RDtBQUFBLEVBQ0EsTUFBTTtBQUFBLElBQVU7QUFBQSxNQUNoQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLElBQUk7QUFBQSxFQUNyRTtBQUFBLEVBQ0EsVUFBVTtBQUFBLElBQVU7QUFBQSxN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QjtBQVZwQyxJQUFNLFNBQU47OztBMUNwSVAsSUFBQUssb0JBV0E7QUFDQSxJQUFBQyx1QkFXQTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJTZXJpYWxpemVkVHlwZSIsICJxdWVyeSIsICJ2ZXJzaW9uIiwgIm1vZHVsZSIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgInJlc3VsdCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJyZXNvbHZlIiwgInJlc29sdmUiLCAid2FpdEZvciIsICJpbXBvcnRfZXF1YWxpemVyIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJkanNWZXJzaW9uIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==
|
|
7538
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvY29tcGF0L2NvbW1vbi50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiLCAiLi4vc3JjL1BsYXllclN0cmVhbUludGVyY2VwdG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBjcmVhdGVFcmlzQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgeyBjcmVhdGVPY2VhbmljQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlT2NlYW5pY0NvbXBhdCc7XG5leHBvcnQgeyBpc0VyaXNQcm94eSwgaXNPY2VhbmljUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vZmFicmljJztcbmV4cG9ydCAqIGZyb20gJy4vcXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2VyZGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyU3RyZWFtSW50ZXJjZXB0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFN0cmVhbVR5cGUsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGF0Q2xpZW50LCBDb21wYXRQcm92aWRlciB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcblxuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIEVyaXMgZnJvbSAnZXJpcyc7XG5cbnR5cGUgRXJpc1VzZXJSZXNvbHZhYmxlID0gRXJpcy5Vc2VyIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXI7XG50eXBlIEVyaXNHdWlsZFJlc29sdmFibGUgPVxuRXJpcy5HdWlsZCB8XG5zdHJpbmcgfFxuRXJpcy5NZW1iZXIgfFxuRXJpcy5HdWlsZENoYW5uZWwgfFxuRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBjcmVhdGVDb21wYXRDbGllbnQoZXJpc1Byb3h5LCAnRXJpcycpLmNsaWVudCBhcyB1bmtub3duIGFzIENsaWVudDtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlU3RhdGVVcGRhdGVQcm94eShcbmNsaWVudDogRXJpcy5DbGllbnQsXG5wcm94eTogRXJpcy5DbGllbnQsXG5oYW5kbGVyOiAoYSwgYikgPT4gdm9pZClcbntcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUudXNlci5pZFxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQoXG4gICAgICAgIG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5ndWlsZC5pZCxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBtZToge1xuICAgICAgICAgICAgICBpZDogbWU/LmlkLFxuICAgICAgICAgICAgICB2b2ljZToge1xuICAgICAgICAgICAgICAgIGFzeW5jIHNldFJlcXVlc3RUb1NwZWFrKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lPy52b2ljZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgLy8gaWYgKG1lKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBtZS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50OiBFcmlzLkNsaWVudCkge1xuICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gIGlmICghYWRhcHRlcnMpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gIH1cblxuICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZ3VpbGRJZCwgYWRhcHRlcl0gb2YgYWRhcHRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2xpZW50Lmd1aWxkcy5nZXQoZ3VpbGRJZCk/LnNoYXJkLmlkID09PSBzaGFyZElkKSB7XG4gICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY2xpZW50Lm9uKCdyYXdXUycsIChwYWNrZXQpID0+IHtcbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YTtcbiAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTZXJ2ZXJVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcGF5bG9hZC5ndWlsZF9pZCAmJlxuICAgICAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCAmJlxuICAgICAgICAgIHBheWxvYWQudXNlcl9pZCA9PT0gY2xpZW50LnVzZXIuaWQpXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU3RhdGVVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzQ2hhbm5lbHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgY29uc3QgaGFuZGxlciA9IHtcbiAgICBjbGllbnQsXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBpZCBpbiBjbGllbnQuY2hhbm5lbEd1aWxkTWFwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgcmVzb2x2ZShyZXNvbHZhYmxlOiBzdHJpbmcgfCBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbiAgICAgICAgICB0aGlzLmNsaWVudC5nZXRDaGFubmVsKHJlc29sdmFibGUpIGFzIEVyaXMuR3VpbGRDaGFubmVsLFxuICAgICAgICAgIGNsaWVudFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGRDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2YWJsZSwgY2xpZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnJlc29sdmUocmVzb2x2YWJsZSk7XG4gICAgICByZXR1cm4gY2hhbm5lbD8uaWQ7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG5jaGFubmVsOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFubmVsKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShjaGFubmVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ2d1aWxkJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlclByb3h5KHRhcmdldC5ndWlsZCwgY2xpZW50KTtcbiAgICAgICAgY2FzZSAnbWVtYmVycyc6XG4gICAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgRXJpcy5Wb2ljZUNoYW5uZWwpLnZvaWNlTWVtYmVycztcbiAgICAgICAgY2FzZSAnaXNWb2ljZUJhc2VkJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT5cbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fFxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNTdGFnZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlclByb3h5KFxuZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFndWlsZCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ3ZvaWNlQWRhcHRlckNyZWF0b3InKSB7XG4gICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IoXG5ndWlsZDogRXJpcy5HdWlsZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJleHBvcnQgY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgdHlwZSBDb21wYXRQcm92aWRlciA9ICdFcmlzJyB8ICdPY2VhbmljJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXRDbGllbnQge1xuICBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXI7XG4gIGNsaWVudDogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGF0Q2xpZW50KGNsaWVudDogYW55LCBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXIpOiBDb21wYXRDbGllbnQge1xuICBSZWZsZWN0LnNldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcixcbiAgICBjbGllbnRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBDb21wYXRQcm92aWRlciB8IG51bGwge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPY2VhbmljUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ09jZWFuaWMnO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9XG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8udmVyc2lvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ2Rlbm8nLCB2ZXJzaW9uOiBEZW5vLnZlcnNpb24uZGVubyB9O1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKVxuICAgIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5cbiAgICBmaWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5cbiAgICBtYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oXG4gICAgICAgICAgKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICB9IGNhdGNoIHtcblxuICAgICAgICAgIC8vIG5vP1xuICAgICAgICB9fVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgIGNvZGUsXG4gICAgICBkZXRhaWxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICByZXR1cm4gc3JjW3JhbmRvbUludChzcmMubGVuZ3RoKV07XG4gIH1cblxuICBzdGF0aWMgYXJyYXlDbG9uZVNodWZmbGU8VD4oc3JjOiBUW10pOiBUW10ge1xuICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgbGV0IG0gPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKG0pIHtcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtLS0pO1xuICAgICAgW2FyclttXSwgYXJyW2ldXSA9IFthcnJbaV0sIGFyclttXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKFxucXVldWU6IEd1aWxkUXVldWUsXG5pdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10gfCBudW1iZXIpID0+XG57XG4gIGlmIChxdWV1ZS5tYXhTaXplIDwgMSB8fCBxdWV1ZS5tYXhTaXplID09PSBJbmZpbml0eSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRyYWNrcyA9XG4gIHR5cGVvZiBpdGVtcyA9PT0gJ251bWJlcicgP1xuICBpdGVtcyA6XG4gIChpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID9cbiAgaXRlbXMudHJhY2tzIDpcbiAgQXJyYXkuaXNBcnJheShpdGVtcykgP1xuICBpdGVtcyA6XG4gIFtpdGVtc10pLlxuICBsZW5ndGg7XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzKSB7XG4gICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFcnJvcigndHJhY2tzIHF1ZXVlJywgbWF4Q2FwLCB0cmFja3MpO1xuICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07IiwgImltcG9ydCB7XG4gIFVzZXIsXG4gIGVzY2FwZU1hcmtkb3duLFxuICBTbm93Zmxha2VVdGlsLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIEFQSVVzZXIgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5ZXIsXG4gIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCxcbiAgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb21cbicuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTZWVrRXZlbnQgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gIG1ldGFkYXRhOiBNO1xuICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPVxuJ3NvdW5kY2xvdWQnIHxcbid5b3V0dWJlJyB8XG4nc3BvdGlmeScgfFxuJ2FwcGxlX211c2ljJyB8XG4nYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAvKipcbiAgICogVGhlIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICB2aWV3czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0XG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAvKipcbiAgICogVGhlIHNvdXJjZVxuICAgKi9cbiAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgZW5naW5lXG4gICAqL1xuICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByYXcgZGF0YVxuICAgKi9cbiAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0eXBlXG4gICAqL1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXplZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHJhdzogYW55O1xuICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICBwdWJsaWMgY2xlYW5UaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgYnJpZGdlZFRyYWNrOiBUcmFjayB8IG51bGwgPSBudWxsO1xuXG4gICNvblNlZWs6ICgoZXZlbnQ6IFNlZWtFdmVudCkgPT4gQXdhaXRlZDx2b2lkPikgfCBudWxsID0gbnVsbDtcbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgdHJhY2sgY2FuIGJlIHNlZWtlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZWVrYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jb25TZWVrICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TZWVrIGV2ZW50XG4gICAqIEBwYXJhbSBmbiBUaGUgb25TZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgaGFuZGxlU2VlayhmbjogKGV2ZW50OiBTZWVrRXZlbnQpID0+IEF3YWl0ZWQ8dm9pZD4pIHtcbiAgICB0aGlzLiNvblNlZWsgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHNlZWtcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBzZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhldmVudDogU2Vla0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuI29uU2VlaykgcmV0dXJuIHRoaXMuI29uU2VlayhldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFjay4gVGhpcyBpcyBub3QgdXNlZnVsIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBBdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHNldFJlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXVkaW8gcmVzb3VyY2UgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT5cbiAgICBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQoXG4gIHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pXG4gIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnZGF0YScsXG4gICAgICAnU2VyaWFsaXplZFRyYWNrJyxcbiAgICAgICdtYWxmb3JtZWQgZGF0YSdcbiAgICApO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpXG4gICAgICAgICAgcmV0dXJuIHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuZ2V0KHJlcy5pZCkhO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKCkgOlxuICAgICAgbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogZGF0YS5xdWVyeV90eXBlID8/IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT5cbiAgICBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKVxuICAgICk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJleHBvcnQgY2xhc3MgRGlzY29yZFBsYXllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlcztcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29kZTogRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlNwYWNlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLFxuICAgICAgYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJnVHlwZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19SRVNVTFQsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfSU1QTEVNRU5URUQsIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RFeGlzdGluZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfRVhJU1RJTkcsIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgICBgJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21pbmltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04sXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PydcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQsXG4gICAgICAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCwgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMLCAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVjZWl2ZXJFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1JFQ0VJVkVSLFxuICAgICAgbWVzc2FnZSB8fFxuICAgICAgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX0FVRElPX1JFU09VUkNFLFxuICAgICAgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTkZPX1JFUVVJUkVELFxuICAgICAgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCxcbiAgICAgIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtcbiAgICAgIGlkID8gYChFeHRyYWN0b3IgRXhlY3V0aW9uIENvbnRleHQgSUQgaXMgJHtpZH0pYCA6ICcnfUZhaWxlZCB0byBicmlkZ2UgdGhpcyBxdWVyeTpcXG4ke1xuICAgICAgZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgRVJSX09VVF9PRl9TUEFDRTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgRVJSX05PX1JFU1VMVDogJ0VSUl9OT19SRVNVTFQnLFxuICBFUlJfTk9UX0lNUExFTUVOVEVEOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gIEVSUl9OT1RfRVhJU1RJTkc6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgRVJSX09VVF9PRl9SQU5HRTogJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6ICdFUlJfTk9fVk9JQ0VfQ0hBTk5FTCcsXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX05PX1JFQ0VJVkVSOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgRVJSX0ZGTVBFR19MT0NBVE9SOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgRVJSX05PX0FVRElPX1JFU09VUkNFOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgRVJSX05PX0dVSUxEX1FVRVVFOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgRVJSX05PX0dVSUxEOiAnRVJSX05PX0dVSUxEJyxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ0VSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRTogJ0VSUl9OT1RfRVhJU1RJTkdfTU9EVUxFJyxcbiAgRVJSX0JSSURHRV9GQUlMRUQ6ICdFUlJfQlJJREdFX0ZBSUxFRCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVycm9yQ29kZXMgPSAodHlwZW9mIEVycm9yQ29kZXMpW2tleW9mIHR5cGVvZiBFcnJvckNvZGVzXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIGVycm9yIGluc3RhbmNlb2YgRGlzY29yZFBsYXllckVycm9yO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhIGBEaXNjb3JkUGxheWVyRXJyb3JgIGVycm9yLlxuICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBoYW5kbGVcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGVycm9yIGlzIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAuXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGhhbmRsZXJcbiAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IsIChlcnJvcikgPT4ge1xuICogICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSBkaXNjb3JkLXBsYXllcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICogIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3I8XG4gIFQgZXh0ZW5kcyBhbnlbXSxcbiAgRiBleHRlbmRzIChlcnJvcjogRGlzY29yZFBsYXllckVycm9yLCAuLi5hcmdzOiBUKSA9PiBhbnksXG4gIFIgZXh0ZW5kcyBSZXR1cm5UeXBlPEY+PihcbmVycm9yOiBhbnksIGhhbmRsZXI6IEYsIGFyZ3M6IFQpOiBSIHtcbiAgaWYgKGlzRGlzY29yZFBsYXllckVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBoYW5kbGVyKGVycm9yLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8iLCAiaW1wb3J0IHsgRGlzY29yZFBsYXllckVycm9yLCBpc0Rpc2NvcmRQbGF5ZXJFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIFR5cGVVdGlsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0OiB1bmtub3duKTogdCBpcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICAgIHJldHVybiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0KTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IERlc2VyaWFsaXphdGlvbkVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIHR5cGUgU2VyaWFsaXplZFRyYWNrLFxuICBUcmFjayxcbiAgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbVxuJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgVHJhY2sgPSAndHJhY2snLFxuICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PlxuZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgaWYgKGlzVHJhY2soZGF0YSkpIHJldHVybiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKFR5cGVVdGlsLmlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwgImltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tKU09OLCBUcmFja1NvdXJjZSB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgdHJhY2tzOiBUcmFja1tdO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICovXG4gIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIHB1YmxpYyBhdXRob3I6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgLyoqXG4gICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllclxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICogLSBgYWxidW1gXG4gICAgICogLSBgcGxheWxpc3RgXG4gICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgKi9cbiAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdClcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkUGxheWxpc3QnLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEluZm9SZXF1aXJlZEVycm9yLCBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9XG4vXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPVxuL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID1cbi9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyBkaXNjb3JkLXBsYXllcjovL2Jsb2IvdXVpZC12NFxuY29uc3QgZGlzY29yZFBsYXllckJsb2JSZWdleCA9IC9eZGlzY29yZC1wbGF5ZXI6XFwvXFwvYmxvYlxcL1xcZCskLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICBEaXNjb3JkUGxheWVyOiBbJ2Rpc2NvcmQtcGxheWVyJ10sXG4gIFlvdVR1YmU6IFtcbiAgJ3lvdXR1YmUuY29tJyxcbiAgJ3lvdXR1LmJlJyxcbiAgJ211c2ljLnlvdXR1YmUuY29tJyxcbiAgJ2dhbWluZy55b3V0dWJlLmNvbScsXG4gICd3d3cueW91dHViZS5jb20nLFxuICAnbS55b3V0dWJlLmNvbSddLFxuXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4vXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbi9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL11cbik7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIC0gRElTQ09SRF9QTEFZRVJfQkxPQlxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgVklNRU86ICd2aW1lbycsXG4gIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gIEZJTEU6ICdmaWxlJyxcbiAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJyxcbiAgRElTQ09SRF9QTEFZRVJfQkxPQjogJ2Rpc2NvcmRQbGF5ZXJCbG9iJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlUeXBlID0gKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgUXVlcnlUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gIHF1ZXJ5OiBzdHJpbmc7XG59XG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAvKipcbiAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgdmltZW9SZWdleCxcbiAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXgsXG4gICAgICBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5cbiAgICAgICAgICAgIHNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uXG4gICAgICAgICAgICBzcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgP1xuICAgICAgICAgIHJlcy51cmwgOlxuICAgICAgICAgIHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEluZm9SZXF1aXJlZEVycm9yKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsIHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID9cbiAgICBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6XG4gICAgbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICBzb2Z0bGltaXRlcjpcbiAgICAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgIHNpbGVuY2VyZW1vdmU6ICdzaWxlbmNlcmVtb3ZlPTE6MDotNTBkQidcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHtcbiAgICBuYW1lOiBGaWx0ZXJzTmFtZTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIHJldHVybiBmaWx0ZXJzLlxuICAgIGZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykuXG4gICAgbWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKS5cbiAgICBqb2luKCcsJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheToge25hbWU6IHN0cmluZzt2YWx1ZTogc3RyaW5nO31bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vLyBAdHMtbm9jaGVja1xuXG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR2F0ZXdheURpc3BhdGNoRXZlbnRzIH0gZnJvbSAnZGlzY29yZC1hcGktdHlwZXMvdjEwJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBhdENsaWVudCwgQ29tcGF0UHJvdmlkZXIgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgKiBhcyBPY2VhbmljIGZyb20gJ29jZWFuaWMuanMnO1xuXG50eXBlIE9jZWFuaWNVc2VyUmVzb2x2YWJsZSA9IE9jZWFuaWMuVXNlciB8IHN0cmluZyB8IE9jZWFuaWMuTWVtYmVyO1xudHlwZSBPY2VhbmljR3VpbGRSZXNvbHZhYmxlID1cbk9jZWFuaWMuR3VpbGQgfFxuc3RyaW5nIHxcbk9jZWFuaWMuTWVtYmVyIHxcbk9jZWFuaWMuR3VpbGRDaGFubmVsIHxcbk9jZWFuaWMuUm9sZTtcbnR5cGUgT2NlYW5pY0NoYW5uZWxSZXNvbHZhYmxlID0gT2NlYW5pYy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2NlYW5pY0NsaWVudChjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBPY2VhbmljLkNsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdvY2VhbmljLmpzJyk7XG5cbiAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIG9jZWFuaWMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogVCB7XG4gIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXkpO1xufVxuXG4vKipcbiAqIEFsbG93cyBPY2VhbmljLmpzIGNsaWVudHMgdG8gYmUgdXNlZCB3aXRoIGRpc2NvcmQtcGxheWVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgY3JlYXRlcyBhIHByb3h5IG9iamVjdCB0aGF0IGludGVyY2VwdHMgY2VydGFpbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIGRpc2NvcmQtcGxheWVyLlxuICogQHBhcmFtIGNsaWVudCBUaGUgT2NlYW5pYy5qcyBjbGllbnQgdG8gYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSBPY2VhbmljLmpzIGNsaWVudCB3aXRoIGRpc2NvcmQtcGxheWVyIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPY2VhbmljQ29tcGF0KGNsaWVudDogT2NlYW5pYy5DbGllbnQpOiBDbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnb2NlYW5pYy5qcycpO1xuXG4gIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgb2NlYW5pY1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gIGNvbnN0IG9jZWFuaWNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVXNlcnNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljR3VpbGRzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljQ2hhbm5lbHNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdfX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHknOlxuICAgICAgICAgIHJldHVybiAoaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpID0+XG4gICAgICAgICAgb2NlYW5pY1ZvaWNlU3RhdGVVcGRhdGVQcm94eSh0YXJnZXQsIG9jZWFuaWNQcm94eSwgaGFuZGxlcik7XG4gICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMoY2xpZW50LmdldE1heExpc3RlbmVycygpICsgMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZGVjcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KG9jZWFuaWNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ09jZWFuaWMnKTtcblxuICByZXR1cm4gY3JlYXRlQ29tcGF0Q2xpZW50KG9jZWFuaWNQcm94eSwgJ09jZWFuaWMnKS5jbGllbnQgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IE9jZWFuaWMuQ2xpZW50LFxucHJveHk6IE9jZWFuaWMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogT2NlYW5pYy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncGFja2V0JywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICBwYXlsb2FkLmd1aWxkX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNDaGFubmVsc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgICAgICAgIHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgT2NlYW5pYy5HdWlsZENoYW5uZWwsXG4gICAgICAgICAgY2xpZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgT2NlYW5pYy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogT2NlYW5pYy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBPY2VhbmljLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlIHx8XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNWb2ljZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICBjYXNlICdpc1N0YWdlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkoXG5ndWlsZDogT2NlYW5pYy5HdWlsZCB8IHVuZGVmaW5lZCxcbmNsaWVudDogT2NlYW5pYy5DbGllbnQpXG46IE9jZWFuaWMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyQ3JlYXRvcihcbmd1aWxkOiBPY2VhbmljLkd1aWxkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0d1aWxkc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY1VzZXJzUHJveHkoY2xpZW50OiBPY2VhbmljLkNsaWVudCwgb2NlYW5pYzogdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBPY2VhbmljVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogT2NlYW5pY1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxcbiAgTCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzXG5FdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAoXG4gICAgdGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSlcbiAgICB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+XG4gIGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgcHVibGljIG9wdGlvbnM6IFQgPSA8VD4ge30pXG4gIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpXG4gIDogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCBjb250ZXh0O1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3MoXG4gIHRyYWNrOiBUcmFjayxcbiAgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPilcbiAge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKFxuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCxcbiAgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSlcbiAgOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbClcbiAgOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufSIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEJyaWRnZUZhaWxlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAqL1xuICBhY3RpdmF0ZTogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBkZWFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLFxuICBlcnJvcjogRXJyb3IpXG4gID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEV4dHJhY3RvclNlc3Npb24+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZFxuICAgKi9cbiAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBgXFx0aW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcXG5cXHRhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO2A7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfVxcbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgICBUW251bWJlcl1bJ2lkZW50aWZpZXInXSxcbiAgICAgIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPj4oXG5cbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmIChcbiAgICB0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fFxuICAgIHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgY29uc3QgZXh0cmFjdG9yID1cbiAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgP1xuICAgIHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDpcbiAgICB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgIGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhcbiAgICAgICAgYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KFxuICBmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sXG4gIGZpbHRlckJsb2NrZWQgPSB0cnVlKVxuICB7XG4gICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLFxuICAgICAgICAnTm9FeHRyYWN0b3JzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgIGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyKVxuICAgIHJldHVybiB7XG4gICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgZXJyb3I6IGVycixcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpXG4gIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID1cbiAgICB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8XG4gICAgICByZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJ1xuICAgICk7XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gcmVzdWx0LmV4dHJhY3RvcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSlcbiAge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoXG5leHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG49PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7IiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVmYXVsdFZhbHVlPzogVCkge31cblxuICAvKipcbiAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgdGhpcy5zdG9yYWdlLmV4aXQoc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdW1lKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn0iLCAiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTsiLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0L2FzeW5jLWNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzQ3R4IHtcbiAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtwbGF5ZXJdJykgYXMgUGxheWVyIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcsIG1haW5Pbmx5ID0gZmFsc2UpIHtcbiAgbGV0IGlzRmFsbGJhY2sgPSBmYWxzZTtcblxuICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCEocGxheWVyID0gU1VQRVJfQ09OVEVYVC5jb25zdW1lKCkpKSB7XG4gICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgaXNGYWxsYmFjayA9IHRydWU7XG4gIH1cblxuICBpZiAoIXBsYXllcilcbiAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgYFBsYXllciBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUsICR7XG4gICAgaXNGYWxsYmFjayA/XG4gICAgJ2RpZCB5b3UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIHBsYXllciB3aXRoIGBuZXcgUGxheWVyKGNsaWVudClgPycgOlxuICAgICdpcyBpdCBiZWluZyBjYWxsZWQgaW5zaWRlIDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpPyd9YFxuXG4gICk7XG5cbiAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgbGV0IGNvbnRleHQ6IEhvb2tzQ3R4IHwgdW5kZWZpbmVkO1xuXG4gIGlmICghaXNGYWxsYmFjaykge1xuICAgIGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpXG4gICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgaG9va05hbWUsXG4gICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQgPSB7XG4gICAgICBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvcihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGFzIHVua25vd24gYXMgSG9va3NDdHg7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0LCBwbGF5ZXIsIGlzRmFsbGJhY2sgfTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUubm9kZTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUuXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGUuIERlZmF1bHRzIHRvIGluZmVycmVkIGd1aWxkIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVF1ZXVlJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5yZXNvbHZlPE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZTtcbn0iLCAiaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgW1xuICAoKSA9PiBULFxuICAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSlcbiAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZTogTm9kZVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVRpbWVsaW5lIHtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IHZvbHVtZTogbnVtYmVyO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gIHBhdXNlKCk6IGJvb2xlYW47XG4gIHJlc3VtZSgpOiBib29sZWFuO1xuICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoKTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pXG46IEd1aWxkUXVldWVUaW1lbGluZSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoXG5vcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0gc2F0aXNmaWVzIEd1aWxkUXVldWVUaW1lbGluZSk7XG5cbiAgcmV0dXJuIHRpbWVsaW5lO1xufSIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25BZnRlckNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xudHlwZSBWb2x1bWVEaXNwYXRjaCA9IHJlYWRvbmx5IFtcbiAgKCkgPT4gbnVtYmVyLFxuICAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKCk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlOiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlPzogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbih2b2x1bWUpKVxuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgQmlxdWFkRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZSxcbiAgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gYW55PiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcj86IGJvb2xlYW47XG4gIGRpc2FibGVSZXZlcmI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xuICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcj86IGJvb2xlYW47XG4gIHZlcmlmeUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihcbiAgZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KVxuICA6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgLy8gdG9kbyh0d2xpdGUpOiBtYXliZSBkaXNhYmxlIHRoZXNlIGJ5IGRlZmF1bHQ/XG4gICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlQ29tcHJlc3NvciA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmRpc2FibGVTZWVrZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlUmV2ZXJiID8/PSB0cnVlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbSxcbiAgICAgIGRpc2FibGVDb21wcmVzc29yOiBvcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgZGlzYWJsZVNlZWtlcjogb3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgZGlzYWJsZVJldmVyYjogb3B0aW9ucy5kaXNhYmxlUmV2ZXJiXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhpc3RpbmcgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGdldDxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBpZCA9XG4gICAgbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgP1xuICAgIG5vZGUuaWQgOlxuICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpITtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgIHJldHVybiBub2RlIGFzIEd1aWxkUXVldWU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhXG4gICAgKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbFR5cGUsXG4gIEd1aWxkLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIFZvaWNlQmFzZWRDaGFubmVsLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQmlxdWFkRmlsdGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBDb21wcmVzc29yUGFyYW1ldGVycyxcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgUmV2ZXJiUGFyYW1ldGVycyxcbiAgU2Vla2VyUGFyYW1ldGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7XG4gIHR5cGUgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9Wb2ljZUNoYW5uZWxFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gYW55PiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yOiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiOiBib29sZWFuO1xuICBkaXNhYmxlU2Vla2VyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZTogJ3NhbXBsZVJhdGVGaWx0ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgUmV2ZXJiVXBkYXRlOiAncmV2ZXJiVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqL1xuICBDb21wcmVzc29yVXBkYXRlOiAnY29tcHJlc3NvclVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICovXG4gIFBsYXllclNlZWs6ICdwbGF5ZXJTZWVrJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgR3VpbGRRdWV1ZUV2ZW50ID1cbih0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50KVtrZXlvZiB0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50XTtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gIE1hbnVhbCA9ICdNQU5VQUwnLFxuICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrUmVtb3ZlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG1lc3NhZ2U6IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eVF1ZXVlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBlcnJvcjogRXJyb3IsXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBza2lwcGluZ1xuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTa2lwXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrLFxuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbixcbiAgZGVzY3JpcHRpb246IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlcl06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgbmV3U3RhdGU6IFZvaWNlU3RhdGUpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRWb2x1bWU6IG51bWJlcixcbiAgbmV3Vm9sdW1lOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSxcbiAgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pXG4gID0+IHVua25vd247XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrPHVua25vd24+LFxuICBjb25maWc6IFN0cmVhbUNvbmZpZyxcbiAgZG9uZTogKCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXldOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFja3M6IFRyYWNrW10sXG4gIGRvbmU6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNhbXBsZSByYXRlIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRSYXRlIFRoZSBvbGQgc2FtcGxlIHJhdGVcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkUmF0ZTogbnVtYmVyLFxuICBuZXdSYXRlOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFJhdGUgVGhlIG9sZCBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcjogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0IHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlciBUaGUgb2xkIHJldmVyYiBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IHJldmVyYiBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUmV2ZXJiVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVyIFRoZSBvbGQgY29tcHJlc3NvciBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IGNvbXByZXNzb3IgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbXByZXNzb3JVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXI6IENvbXByZXNzb3JQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21wcmVzc29yUGFyYW1ldGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgc2VlayBwb3NpdGlvblxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgcGFyYW1ldGVyczogU2Vla2VyUGFyYW1ldGVycylcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPVxuKHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGUpW2tleW9mIHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGVdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IGFueT4ge1xuICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAjZGVsZXRlZCA9IGZhbHNlO1xuICAjc2h1ZmZsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICBzdHJlYW0sXG4gICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgfSk7XG4gIHB1YmxpYyByZXBlYXRNb2RlOiBRdWV1ZVJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPilcbiAge1xuICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKVxuICAgIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpXG4gICAgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiZcbiAgICAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKVxuICAgIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYFxuICAgICk7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHF1ZXVlIGNhbiBpbnRlcmNlcHQgc3RyZWFtc1xuICAgKi9cbiAgcHVibGljIGNhbkludGVyY2VwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmXG4gICAgICAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIHByZXBlbmQodHJhY2s6IFRyYWNrIHwgUXVldWU8VHJhY2s+IHwgQXJyYXk8VHJhY2s+LCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgYCR7aW5kZXh9YCxcbiAgICAgICAgJzAnLFxuICAgICAgICBgJHt0aGlzLnRyYWNrcy5zaXplfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBBcnJheS5pc0FycmF5KHRyYWNrKSA/XG4gICAgdHJhY2subGVuZ3RoIDpcbiAgICB0cmFjayBpbnN0YW5jZW9mIFF1ZXVlID9cbiAgICB0cmFjay5zaXplIDpcbiAgICAxO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIGNvdW50KTtcblxuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID0gaW5kZXggPT09IDAgPyAwIDogaW5kZXggLSAxO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluc2VydGlvbkluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgdHJhY2sgb3IgdHJhY2sgcmVzb2x2YWJsZSB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayByZXNvbHZhYmxlIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApLiBJZiA+IDAsIHRoZSBpbnNlcnRlZCB0cmFjayB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGFwcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoXG4gICAgICBjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkIVxuICAgICk7XG4gICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgTm9Wb2ljZUNoYW5uZWxFcnJvcigpO1xuICAgIGlmICghY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgY2hhbm5lbCxcbiAgICAgIHRoaXMsXG4gICAgICBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICBjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSlcbiAge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke1xuICAgICAgY2hhbm5lbC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgPyAnc3RhZ2UnIDogJ3ZvaWNlJ30gY2hhbm5lbCAke1xuICAgICAgY2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsoXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkoXG4gIHRyYWNrOiBUcmFja0xpa2UsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KVxuICB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIucGxheSh0aGlzLmNoYW5uZWwsIHRyYWNrLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGV2ZW50IG9uIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pXG4gIDogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLCBlKSk7XG4gICAgZGlzcGF0Y2hlci5vbihcbiAgICAgICdkZWJ1ZycsXG4gICAgICAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKVxuICAgICk7XG4gICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvbHVtZUNoYW5nZSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBhcmVPYmplY3RzRGlmZmVyZW50ID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICBpZiAoIWEgJiYgIWIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGEpLnNvbWUoKGspID0+IGFba10gIT09IGJba10pO1xuICAgIH07XG5cbiAgICBkaXNwYXRjaGVyLm9uKCdzYW1wbGVSYXRlJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSAhPT0gZi5zYW1wbGVSYXRlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlLFxuICAgICAgICAgIGYuc2FtcGxlUmF0ZVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZi5zYW1wbGVSYXRlO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5zZWVrZXI/LnNldFNhbXBsZVJhdGUoZi5zYW1wbGVSYXRlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLnNlZWtlcj8uc2V0VG90YWxEdXJhdGlvbih0aGlzLm5vZGUuZXN0aW1hdGVkRHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5jdXJyZW50RmlsdGVyICE9PSB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlcikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlNhbXBsZVJhdGVGaWx0ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA/PyBudWxsLFxuICAgICAgICAgIGYuY3VycmVudEZpbHRlclxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA9IGYuY3VycmVudEZpbHRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdyZXZlcmInLCAoZikgPT4ge1xuICAgICAgaWYgKGFyZU9iamVjdHNEaWZmZXJlbnQoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5SZXZlcmJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID8/IG51bGwsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdzZWVrZXInLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICBgU2Vla2VyID4+IFNlZWtlZCB0byAke2Yuc2Vla1RhcmdldH1tcyBmb3IgVHJhY2sgJHt0aGlzLmN1cnJlbnRUcmFjaz8udGl0bGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5zZWVrVGFyZ2V0ICE9IG51bGwpIHRoaXMubm9kZS5zZXRQcm9ncmVzcyhmLnNlZWtUYXJnZXQpO1xuXG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNlZWssIHRoaXMsIGYpO1xuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5vbignY29tcHJlc3NvcicsIChmKSA9PiB7XG4gICAgICBpZiAoYXJlT2JqZWN0c0RpZmZlcmVudChmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5Db21wcmVzc29yVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gbnVsbCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5jb21wcmVzc29yID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbixcbiAgQ29tcHJlc3NvclBhcmFtZXRlcnMsXG4gIFJldmVyYlBhcmFtZXRlcnMsXG4gIFNlZWtlclBhcmFtZXRlcnMsXG4gIFJlc2FtcGxlUGFyYW1ldGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBTZWVrRXZlbnQgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBOb0F1ZGlvUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gIHR5cGU/OiBTdHJlYW1UeXBlO1xuICBkYXRhOiBUcmFjaztcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZUNvbXByZXNzb3I/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJldmVyYj86IGJvb2xlYW47XG4gIGRpc2FibGVTZWVrZXI/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlRmlsdGVycz86IENvbW1vblJlc2FtcGxlckZpbHRlclByZXNldDtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcmF0aW86IG51bWJlcjtcbiAgICBhdHRhY2s6IG51bWJlcjtcbiAgICByZWxlYXNlOiBudW1iZXI7XG4gICAgbWFrZXVwR2FpbjogbnVtYmVyO1xuICAgIGtuZWVXaWR0aDogbnVtYmVyO1xuICB9O1xuICByZXZlcmI/OiB7XG4gICAgcm9vbVNpemU6IG51bWJlcjtcbiAgICBkYW1waW5nOiBudW1iZXI7XG4gICAgd2V0TGV2ZWw6IG51bWJlcjtcbiAgICBkcnlMZXZlbDogbnVtYmVyO1xuICB9O1xuICBzZWVrZXI/OiB7XG4gICAgc2Vla1RhcmdldDogbnVtYmVyIHwgbnVsbDtcbiAgICB0b3RhbER1cmF0aW9uOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBSZXNhbXBsZVBhcmFtZXRlcnMpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICBjb21wcmVzc29yOiAoZmlsdGVyczogQ29tcHJlc3NvclBhcmFtZXRlcnMpID0+IGFueTtcbiAgcmV2ZXJiOiAoZmlsdGVyczogUmV2ZXJiUGFyYW1ldGVycykgPT4gYW55O1xuICBzZWVrZXI6IChmaWx0ZXJzOiBTZWVrZXJQYXJhbWV0ZXJzKSA9PiBhbnk7XG4gIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICNpbnRlcmNlcHRvcjogSW50ZXJjZXB0ZWRTdHJlYW0gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsXG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpXG4gIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICovXG4gICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgYXVkaW9QbGF5ZXIgfHxcbiAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgKi9cbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbihcbiAgICAgICdlcnJvcicsXG4gICAgICAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpXG4gICAgKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycykge1xuICAgICAgICB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kc3AuY29tcHJlc3Nvcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXByZXNzb3InLCB0aGlzLmRzcC5jb21wcmVzc29yLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXZlcmIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXZlcmInLCB0aGlzLmRzcC5yZXZlcmIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnNlZWtlcikge1xuICAgICAgICB0aGlzLmVtaXQoJ3NlZWtlcicsIHRoaXMuZHNwLnNlZWtlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgbmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmXG4gICAgICBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpXG4gICAgICB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcblxuICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8XG4gICAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJlxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKVxuICAgICAge1xuICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICovXG4gIGdldCBwYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gIH1cblxuICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGF1c2VkIHx8XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICovXG4gIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICovXG4gIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgKi9cbiAgaXNJZGxlKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGVzdHJveWVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICovXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICovXG4gIGlzU2lnbmFsbGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAqL1xuICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wczogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjogb3BzPy5zYW1wbGVSYXRlID9cbiAgICAgIHtcbiAgICAgICAgaW5wdXRTYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgfSxcbiAgICAgIHZvbHVtZToge1xuICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICB9LFxuICAgICAgY29tcHJlc3Nvcjogb3BzPy5jb21wcmVzc29yID9cbiAgICAgIHtcbiAgICAgICAgdGhyZXNob2xkOiBvcHM/LmNvbXByZXNzb3IudGhyZXNob2xkLFxuICAgICAgICByYXRpbzogb3BzPy5jb21wcmVzc29yLnJhdGlvLFxuICAgICAgICBhdHRhY2s6IG9wcz8uY29tcHJlc3Nvci5hdHRhY2ssXG4gICAgICAgIHJlbGVhc2U6IG9wcz8uY29tcHJlc3Nvci5yZWxlYXNlLFxuICAgICAgICBtYWtldXBHYWluOiBvcHM/LmNvbXByZXNzb3IubWFrZXVwR2FpbixcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICAgIGtuZWVXaWR0aDogb3BzPy5jb21wcmVzc29yLmtuZWVXaWR0aFxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICByZXZlcmI6IG9wcz8ucmV2ZXJiID9cbiAgICAgIHtcbiAgICAgICAgcm9vbVNpemU6IG9wcz8ucmV2ZXJiLnJvb21TaXplLFxuICAgICAgICBkYW1waW5nOiBvcHM/LnJldmVyYi5kYW1waW5nLFxuICAgICAgICB3ZXRMZXZlbDogb3BzPy5yZXZlcmIud2V0TGV2ZWwsXG4gICAgICAgIGRyeUxldmVsOiBvcHM/LnJldmVyYi5kcnlMZXZlbCxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJldmVyYlxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzZWVrZXI6IG9wcz8uc2Vla2VyID9cbiAgICAgIHtcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVNlZWtlcixcbiAgICAgICAgc2Vla1RhcmdldDogb3BzPy5zZWVrZXIuc2Vla1RhcmdldCxcbiAgICAgICAgc2FtcGxlUmF0ZTogNDgwMDAsXG4gICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICB0b3RhbER1cmF0aW9uOiBvcHM/LnNlZWtlci50b3RhbER1cmF0aW9uXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZFxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5kc3Auc2Vla2VyKSB7XG4gICAgICAvLyB1c2VkIHRvIGhhbmRsZSBiYWNrd2FyZCBzZWVraW5nXG4gICAgICB0aGlzLmRzcC5zZWVrZXIub24oJ3NlZWsnLCAoZGF0YTogU2Vla0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMucXVldWUubm9kZS5yZXF1ZXN0U2VlayhkYXRhKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUsIG9wcz8uZGF0YSkuXG4gICAgY2F0Y2goXG4gICAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgfSkgYXMgUG9zdFByb2Nlc3NlZFJlc3VsdFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcblxuICAgIGNvbnN0IGZvcm1hdCA9IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5O1xuXG4gICAgbGV0IF9zdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgaWYgKHRoaXMucXVldWUuY2FuSW50ZXJjZXB0KCkpIHtcbiAgICAgIHRoaXMuI2ludGVyY2VwdG9yID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtKS5waXBlKHRoaXMuI2ludGVyY2VwdG9yKTtcblxuICAgICAgX3N0cmVhbSA9IHRoaXMuI2ludGVyY2VwdG9yO1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5oYW5kbGVJbnRlcmNlcHRpbmdTdHJlYW0oXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIG9wcz8uZGF0YSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICB0aGlzLiNpbnRlcmNlcHRvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3N0cmVhbSA9IHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW07XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShfc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IGZvcm1hdCxcbiAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEgYXMgVHJhY2ssXG4gICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcHJlc3NvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmV2ZXJiIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlZWtlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBzdHJlYW1cbiAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9BdWRpb1Jlc291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24sXG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LFxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgVHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybUNhbGxiYWNrLCB0eXBlIFdyaXRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW0gdGhhdCBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGNvbnN1bWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjb25zdW1lci5cbiAqIEBleGFtcGxlIGNvbnN0IHN0cmVhbSA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuICpcbiAqIC8vIHJlYWwgY29uc3VtZXJcbiAqIHN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCdmaWxlLnR4dCcpKTtcbiAqXG4gKiAvLyBtYW4gaW4gdGhlIG1pZGRsZSBjb25zdW1lclxuICogY29uc3QgbWFuSW5UaGVNaWRkbGUgPSBuZXcgV3JpdGFibGUoe1xuICogIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAqICAgY29uc29sZS5sb2coY2h1bmsudG9TdHJpbmcoKSk7XG4gKiAgIGNhbGxiYWNrKCk7XG4gKiAgfVxuICogfSk7XG4gKlxuICogLy8gc3RyZWFtLmludGVyY2VwdG9ycyBpcyBhIFNldCBvZiBXcml0YWJsZSBzdHJlYW1zXG4gKiBzdHJlYW0uaW50ZXJjZXB0b3JzLmFkZChtYW5JblRoZU1pZGRsZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRlZFN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnMgPSBuZXcgU2V0PFdyaXRhYmxlPigpO1xuICAjaW50ZXJjZXB0aW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3RhcnQgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2YgSW50ZXJjZXB0ZWRTdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc3RhcnRJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGludGVyY2VwdGluZyB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgY29uc3VtZWQgYnkgdGhlIGludGVyY2VwdG9ycy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGVtcG9yYXJpbHkgc3RvcCB0aGUgaW50ZXJjZXB0aW9uLiBUaGUgc3RvcHBlZCBzdGF0ZSBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIHN0YXJ0SW50ZXJjZXB0aW5nIGFnYWluLlxuICAgKi9cbiAgcHVibGljIHN0b3BJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RyZWFtIGlzIGJlaW5nIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgaXNJbnRlcmNlcHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVyY2VwdGluZztcbiAgfVxuXG4gIHB1YmxpYyBfdHJhbnNmb3JtKFxuICBjaHVuazogQnVmZmVyLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjaylcbiAgOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goY2h1bmssIGVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLiNpbnRlcmNlcHRpbmcgJiYgdGhpcy5pbnRlcmNlcHRvcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgY29uc3VtZXIud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmVuZCgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2Rlc3Ryb3koZXJyb3I6IEVycm9yLCBjYWxsYmFjazogVHJhbnNmb3JtQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVFcnJvciA9IFN0cmluZyhlcnJvcikuaW5jbHVkZXMoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJyk7XG4gICAgY29uc3QgZXJyID0gaWdub3JlRXJyb3IgPyB1bmRlZmluZWQgOiBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmRlc3Ryb3koZXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyY2VwdG9ycy5jbGVhcigpO1xuXG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufSIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuXG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59IiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vUmVzdWx0RXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcbmltcG9ydCB7IFNlZWtFdmVudCB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcikge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlci5nZXRQb3NpdGlvbigpO1xuICAgICAgaWYgKHBvcyA+IDApIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuXG4gICAgdG9BcnJheSgpLlxuICAgIGZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnMuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgfSkuXG4gICAgZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggP1xuICAgIDEgOlxuICAgIG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXI7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIC8vIGR1cmF0aW9uIG11bHRpcGxpZXIgY2hlY2tzIGZmbXBlZyBmaWx0ZXJzIHRoYXQgbWF5IGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuXG4gICAgLy8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBuYXRpdmUgcmVzYW1wbGVyIGZpbHRlciBhcyBpdCBtYXkgYWxzbyBhZmZlY3QgdGhlIGR1cmF0aW9uXG4gICAgaWYgKHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIpIHtcbiAgICAgIC8vIGdldCB0aGUgcmVzYW1wbGVyIHJhdGlvIGlmIHdlIGhhdmUgb25lXG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIuZ2V0UmF0aW8oKTtcbiAgICAgIGlmIChyYXRpbyA8PSAwKSByZXR1cm4gdmFsO1xuXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWwgLyByYXRpbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSkge1xuICAgICAgY29uc3QgdHJhY2tIYXNMZWdhY3lNZXRhZGF0YSA9XG4gICAgICB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEgJiZcbiAgICAgIHRyYWNrLm1ldGFkYXRhLmJyaWRnZSAhPSBudWxsO1xuICAgICAgY29uc3QgdHJhY2tIYXNNZXRhZGF0YSA9IHRyYWNrPy5icmlkZ2VkVHJhY2sgIT0gbnVsbDtcblxuICAgICAgaWYgKHRyYWNrSGFzTGVnYWN5TWV0YWRhdGEgfHwgdHJhY2tIYXNNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIHRyYWNrLmJyaWRnZWRUcmFjaz8uZHVyYXRpb25NUyA/P1xuICAgICAgICAoXG4gICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfT4pLlxuICAgICAgICBtZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgP1xuICAgIHRoaXMucGxheWJhY2tUaW1lIDpcbiAgICB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgfSxcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKGN1cnJlbnQgLyB0b3RhbCAqIDEwMClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLFxuICAgICAgbGVmdENoYXIgPSAnXFx1MjVBQycsXG4gICAgICByaWdodENoYXIgPSAnXFx1MjVBQycsXG4gICAgICBsZW5ndGggPSAxNSxcbiAgICAgIHRpbWVjb2RlcyA9IHRydWUsXG4gICAgICBzZXBhcmF0b3IgPSAnXFx1MjUwMydcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsXG4gICAgICAgIFN0cmluZyhsZW5ndGgpLFxuICAgICAgICAnMCcsXG4gICAgICAgICdGaW5pdGUgTnVtYmVyJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxuICAgICAgdGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUgKiBsZW5ndGhcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbihcbiAgICAgICAgICAnJ1xuICAgICAgICApfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7XG4gICAgICAgIHRpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke1xuICAgICAgICBzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChcbiAgICAgICAgICBsZW5ndGggLSAxXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlayB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZHVyYXRpb24gPT09IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5TRUVLX09WRVJfVEhSRVNIT0xELFxuICAgICAgICBkZXNjcmlwdGlvbjogbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgICAnW2R1cmF0aW9uXScsXG4gICAgICAgICAgU3RyaW5nKGR1cmF0aW9uKSxcbiAgICAgICAgICAnMCcsXG4gICAgICAgICAgU3RyaW5nKHRoaXMudG90YWxEdXJhdGlvbilcbiAgICAgICAgKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuXG4gICAgY29uc3Qgc2Vla2VyID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcjtcblxuICAgIGlmIChzZWVrZXIpIHtcbiAgICAgIHNlZWtlci5zZWVrKGR1cmF0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbikudGhlbigodikgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrLCB0aGlzLnF1ZXVlLCB7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSxcbiAgICAgICAgICBzZWVrVGFyZ2V0OiBkdXJhdGlvbixcbiAgICAgICAgICB0b3RhbER1cmF0aW9uOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHZvbHVtZVxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm9sdW1lXG4gICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGJpdCByYXRlXG4gICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShcbiAgICAgIHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5J1xuICAgIH07XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICByZWFzb24sXG4gICAgICBkZXNjcmlwdGlvblxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgaWYgKGVtaXRFdmVudClcbiAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrLCBmYWxzZSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUudW5zaGlmdChyZW1vdmVkKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkp1bXAsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMganVtcGVkIHRvIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICovXG4gIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0bywgZGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICd0cmFjayB2YWx1ZScsXG4gICAgICAnaW5zdGFuY2Ugb2YgVHJhY2snLFxuICAgICAgU3RyaW5nKHRyYWNrKVxuICAgICk7XG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIHRyYWNrKTtcbiAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICBpZiAoc3JjIDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNvdXJjZSB0byBzZWVrXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzZWVrIHBhcmFtZXRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0U2VlayhkYXRhOiBTZWVrRXZlbnQpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0cmFjay5zZWVrYWJsZSkge1xuICAgICAgcmV0dXJuIHRyYWNrLnNlZWsoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGRhdGEucG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgXG4gICAgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDBcbiAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgIG9wdGlvbnNcbiAgICApITtcblxuICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLidcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTm9SZXN1bHRFcnJvcihcbiAgICAgICAgJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCdcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3NpZ25lZFJlc291cmNlID0gdHJhY2sucmVzb3VyY2U7XG5cbiAgICAgIGlmIChhc3NpZ25lZFJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdUcmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2UgYXNzaWduZWQsIHBsYXllciB3aWxsIG5vdyBwbGF5IHRoZSByZXNvdXJjZSBkaXJlY3RseS4uLidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoXG4gICAgICBzcmMgPT09ICdzcG90aWZ5JyA/XG4gICAgICAnc3BvdGlmeVNvbmcnIDpcbiAgICAgIHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/XG4gICAgICAnYXBwbGVNdXNpY1NvbmcnIDpcbiAgICAgIHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLlxuICAgICAgdGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKVxuICAgICAgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0sIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gdXNpbmcgZXh0cmFjdG9ycy4uLidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBkaXNhYmxlQ29tcHJlc3NvcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgICAgIGRpc2FibGVSZXZlcmI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgICAgIGRpc2FibGVTZWVrZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgICAgIGNvbXByZXNzb3I6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHJldmVyYjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgc2Vla2VyOiB7XG4gICAgICAgICAgICBzZWVrVGFyZ2V0OlxuICAgICAgICAgICAgb3B0aW9ucy50cmFuc2l0aW9uTW9kZSAmJiBvcHRpb25zLnNlZWsgIT0gbnVsbCA/XG4gICAgICAgICAgICBvcHRpb25zLnNlZWsgOlxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb246IHRyYWNrLmR1cmF0aW9uTVMgPz8gMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA/PyAoXG4gICAgICAgICAgdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgP1xuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOlxuICAgICAgICAgIHVuZGVmaW5lZCksXG4gICAgICAgICAgYmlxdWFkRmlsdGVyOlxuICAgICAgICAgIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXcsXG4gICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgfTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZXIgPSByZXNvbHZlKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LldpbGxQbGF5VHJhY2ssXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIHRyYWNrLFxuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWUsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlU2Vla2VyXS5cbiAgICAgIGV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPVxuICAgICAgISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fFxuICAgICAgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+XG4gICAgICBbXG4gICAgICBTdHJlYW1UeXBlLk9wdXMsXG4gICAgICBTdHJlYW1UeXBlLldlYm1PcHVzLFxuICAgICAgU3RyZWFtVHlwZS5PZ2dPcHVzLFxuICAgICAgU3RyZWFtVHlwZS5SYXcsXG4gICAgICAncGNtJ10uXG4gICAgICBpbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgIGlmIChcbiAgICAgIHNob3VsZFNraXBGRm1wZWcgJiZcbiAgICAgICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJlxuICAgICAgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmXG4gICAgICBkZW11eGFibGUoc3RyZWFtU3JjLnN0cmVhbS4kZm10KSlcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyAkZm10LCBzdHJlYW0gfSA9IHN0cmVhbVNyYy5zdHJlYW07XG4gICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtcbiAgICAgICAgICBzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gXG5cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpc1JhdyA9ICRmbXQgPT09ICdwY20nIHx8ICRmbXQgPT09IFN0cmVhbVR5cGUuUmF3O1xuXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBvcHVzU3RyZWFtID1cbiAgICAgICAgaXNSYXcgfHwgJGZtdCA9PT0gU3RyZWFtVHlwZS5PcHVzID9cbiAgICAgICAgc3RyZWFtIDpcbiAgICAgICAgJGZtdCA9PT0gU3RyZWFtVHlwZS5PZ2dPcHVzID9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IE9nZ0RlbXV4ZXIoKSBhcyBhbnkpIDpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IFdlYm1EZW11eGVyKCkgYXMgYW55KTtcblxuICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgaWYgKGlzUmF3KSB7XG4gICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyO1xuXG4gICAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgJ0Rpc3BhdGNoZXIgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIHF1ZXVlIGJlaW5nIGRlbGV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcGVyYXRpb24uIENhbmNlbGxpbmcgdGhlIHN0cmVhbS4uLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBkaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShcbiAgICAgICAgICBmaW5hbFN0cmVhbSxcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID1cbiAgICB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fFxuICAgIG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuYmxvY2tTdHJlYW1Gcm9tPy5zb21lKFxuICAgICAgICAgIChleHQpID0+IGV4dCA9PT0gZXh0cmFjdG9yLmlkZW50aWZpZXJcbiAgICAgICAgKSlcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBjYW5TdHJlYW0gPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgdHJhY2sudXJsLFxuICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke1xuICAgICAgdHJhY2sudGl0bGV9LCB1cmw6ICR7XG4gICAgICB0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtcbiAgICAgIHN0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgXG5cbiAgICApO1xuXG4gICAgcmV0dXJuIHN0cmVhbUluZm87XG4gIH1cblxuICBhc3luYyAjY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kLi4uYFxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJpZnlGYWxsYmFja1N0cmVhbSA9IHRoaXMucXVldWUub3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcblxuICAgICAgICBpZiAodmVyaWZ5RmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhbGxiYWNrIHN0cmVhbSB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZCwgdmFsaWRhdGluZyBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNob3VsZFByb2NlZWQgPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCB0cmFjay5zb3VyY2VcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFzaG91bGRQcm9jZWVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdmFsaWRhdGUgcXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nICR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgUXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHdhcyB2YWxpZGF0ZWQgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uIFByb2NlZWRpbmcgd2l0aCBleHRyYWN0aW9uLi4uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrcyA9IGF3YWl0IGV4dHJhY3Rvci5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsXG4gIHRyYWNrOiBUcmFjayxcbiAgc2VlayA9IDAsXG4gIG9wdXM/OiBib29sZWFuKVxuICB7XG4gICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnXG4gICAgfSkuXG4gICAgb24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtcbiAgICAgICAgZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gXG5cbiAgICAgICk7XG5cbiAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgfVxufSIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgLyoqXG4gICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAqXG4gICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSxcbiAgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKVxuICB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzLCBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXIsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZUZpbHRlcjpcbiAgU3RyZWFtQ29uZmlnWydkaXNwYXRjaGVyQ29uZmlnJ11bJ3NhbXBsZVJhdGVGaWx0ZXJzJ10gfFxuICBudWxsO1xuICBjb21wcmVzc29yOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsnY29tcHJlc3NvciddIHwgbnVsbDtcbiAgcmV2ZXJiOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsncmV2ZXJiJ10gfCBudWxsO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZXF1YWxpemVyUHJlc2V0cyA9IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ7XG4gIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgYmlxdWFkOiBudWxsLFxuICAgIGVxdWFsaXplcjogW10sXG4gICAgZmlsdGVyczogW10sXG4gICAgdm9sdW1lOiAxMDAsXG4gICAgc2FtcGxlUmF0ZTogLTEsXG4gICAgY29tcHJlc3NvcjogbnVsbCxcbiAgICByZXZlcmI6IG51bGwsXG4gICAgc2FtcGxlUmF0ZUZpbHRlcjogbnVsbFxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3NvciB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCBjb21wcmVzc29yKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcmIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJldmVyYiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBDTSBTZWVrZXIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Vla2VyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlayxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBtXG4gICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8XG4gICAgICAgIEJpcXVhZEZpbHRlcnMsXG4gICAgICAgIG51bWJlcj4gfFxuICAgICAgbnVsbCB8fCBudWxsKTtcblxuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZpbHRlcnM/LmZpbHRlcnMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZmbXBlZzogdGhpcy5mZm1wZWcsXG4gICAgICBlcXVhbGl6ZXI6IHRoaXMuZXF1YWxpemVyLFxuICAgICAgYmlxdWFkOiB0aGlzLmJpcXVhZCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcmFwaCB7XG4gIGZmbXBlZzogRmlsdGVyc1tdO1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59IiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcsIGNyZWF0ZUZGbXBlZ0FyZ3MgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1NUUklORyhcbnN0cmVhbTogc3RyaW5nLFxuZm10Pzogc3RyaW5nLFxuY29va2llcz86IHN0cmluZylcbntcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIHJlY29ubmVjdDogMSxcbiAgICByZWNvbm5lY3Rfc3RyZWFtZWQ6IDEsXG4gICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICBpOiBzdHJlYW0sXG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICBjb29raWVzOlxuICAgIHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/XG4gICAgIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/XG4gICAgY29va2llcyA6XG4gICAgYFwiJHtjb29raWVzfVwiYCA6XG4gICAgbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKFxuc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZyxcbm9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKVxuOiBSZWFkYWJsZSB7XG4gIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICBvcHRpb25zID8/PSB7fTtcbiAgY29uc3QgYXJncyA9XG4gIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID9cbiAgRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOlxuICBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6XG4gICAgICB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gIW0udXNlci5ib3RcbiAgICAgICkuc2l6ZSB8fCAwLFxuICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgcGxheWVyOiB0aGlzLnF1ZXVlLnBsYXllci52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICB9XG59IiwgImltcG9ydCB7IE5vdEV4aXN0aW5nRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7dGltZXN0YW1wOiBudW1iZXI7bGluZTogc3RyaW5nO307XG5cbmNvbnN0IHRpbWVzdGFtcFBhdHRlcm4gPSAvXFxbKFxcZHsyfSk6KFxcZHsyfSlcXC4oXFxkezJ9KVxcXS87XG5cbmV4cG9ydCBjbGFzcyBTeW5jZWRMeXJpY3NQcm92aWRlciB7XG4gICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICNvblVuc3Vic2NyaWJlOiBVbnN1YnNjcmliZSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdClcbiAge1xuICAgIGlmIChyYXc/LnN5bmNlZEx5cmljcykgdGhpcy5sb2FkKHJhdz8uc3luY2VkTHlyaWNzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGxvYWQobHlyaWNzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWx5cmljcykgdGhyb3cgbmV3IE5vdEV4aXN0aW5nRXJyb3IoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgdGhpcy5seXJpY3MuY2xlYXIoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aW1lc3RhbXBQYXR0ZXJuKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID1cbiAgICAgICAgcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLnNldCh0aW1lc3RhbXAsIGxpbmUucmVwbGFjZSh0aW1lc3RhbXBQYXR0ZXJuLCAnJykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGxvd2VzdFRpbWUgPT0gbnVsbCB8fCB0aW1lIDwgbG93ZXN0VGltZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSlcbiAgICByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+XG4gICAgTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGFcbiAgICApO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgbGFzdFZhbHVlICE9PSBudWxsICYmXG4gICAgICBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiZcbiAgICAgIGx5cmljcy50aW1lc3RhbXAgPT09IGxhc3RWYWx1ZS50aW1lc3RhbXApXG5cbiAgICAgIHJldHVybjtcblxuICAgICAgbGFzdFZhbHVlID0gbHlyaWNzO1xuXG4gICAgICB0aGlzLiNjYWxsYmFjayhseXJpY3MubGluZSwgbHlyaWNzLnRpbWVzdGFtcCk7XG4gICAgfSwgdGhpcy5pbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxufSIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgcHVibGljIGxpbWl0ID0gMTtcbiAgcHVibGljIHJlbWFpbmluZyA9IDE7XG4gIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgcHVibGljIHF1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIE1BWF9SRVRSSUVTID0gNTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBidWNrZXQgaXMgcmF0ZSBsaW1pdGVkLlxuICAgKi9cbiAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nIDw9IDAgJiYgRGF0ZS5ub3coKSA8IHRoaXMucmVzZXRBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVucXVldWUocmVxOiBSZXF1ZXN0RW50aXR5KSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLmFjcXVpcmUoKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW50cnkucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3QocmVxOiBSZXF1ZXN0RW50aXR5LCByZXRyaWVzID0gMCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICB3aGlsZSAodGhpcy5pc1JhdGVMaW1pdGVkKCkpIHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgIH1cblxuICAgIGxldCBwYXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxKCk7XG5cbiAgICAgIHRoaXMuX3BhdGNoSGVhZGVycyhyZXMpO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keToge1xuICAgICAgICAgICAgY29kZTogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgIH0gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHtjb2RlOiBudW1iZXI7fTtcblxuICAgICAgICAgIGVycm9yLm5hbWUgPSBib2R5Lm5hbWU7XG4gICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoYEhUVFAgRXJyb3I6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhc3MgPSB0cnVlO1xuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocGFzcykgdGhyb3cgZTtcblxuICAgICAgY29uc3QgYmFkUmVxID0gZSBpbnN0YW5jZW9mIEVycm9yICYmIC9FcnJvcjogNFswLTldezJ9Ly50ZXN0KGUubWVzc2FnZSk7XG5cbiAgICAgIGlmICghYmFkUmVxICYmIHJldHJpZXMgPCB0aGlzLk1BWF9SRVRSSUVTKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSwgKytyZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKSk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJykpO1xuICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPVxuICAgIE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKFxuICAgICAgL1tBLVpdL2csXG4gICAgICAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PlxubmV3IFVSTFNlYXJjaFBhcmFtcyh0b1NuYWtlQ2FzZShwYXJhbXMpKS50b1N0cmluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICB0cmFja05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwbGFpbkx5cmljczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHN5bmNlZEx5cmljcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTHJjR2V0UmVzdWx0ID0gT21pdDxMcmNTZWFyY2hSZXN1bHQsICduYW1lJz47XG5cbmV4cG9ydCBjbGFzcyBMcmNMaWIge1xuICAvKipcbiAgICogVGhlIEFQSSBVUkxcbiAgICovXG4gIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCB0aW1lb3V0LiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgdGltZW91dCA9IDE1XzAwMDtcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgKi9cbiAgcHVibGljIGJ1Y2tldCA9IG5ldyBTZXF1ZW50aWFsQnVja2V0KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTHJjTGliIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmV0cnkgbGltaXQuIERlZmF1bHQgaXMgNS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgKi9cbiAgcHVibGljIHNldFJldHJ5TGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVja2V0Lk1BWF9SRVRSSUVTID0gbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzIGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0QnlJZChpZDogYCR7bnVtYmVyfWAgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4oYGdldC8ke2lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2FjaGVkIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVkKHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChwYXJhbXM6IExyY1NlYXJjaFBhcmFtcykge1xuICAgIGlmICghcGFyYW1zLnEgJiYgIXBhcmFtcy50cmFja05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdFtdPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgQVBJXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gVXRpbC5nZXRSdW50aW1lKCk7XG5cbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID1cbiAgICAgIG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRoaXMudGltZW91dCksXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IGBEaXNjb3JkLVBsYXllci8ke3RoaXMucGxheWVyLnZlcnNpb259ICR7XG4gICAgICAgICAgcnVudGltZVZlcnNpb24gPz8gJyd9YC5cbiAgICAgICAgICB0cmltRW5kKCksXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBbTHJjTGliXSBSZXF1ZXN0aW5nICR7cGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCxcbiAgICAgICAgaW5pdFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5idWNrZXQuZW5xdWV1ZShkaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiByZXMuanNvbigpO1xuICB9XG59IiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIEF1ZGlvUGxheWVyIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gIC8qKlxuICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248XG4gICAgU25vd2ZsYWtlLFxuICAgIFN0cmVhbURpc3BhdGNoZXI+KFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAgOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoKTtcbiAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubixcbiAgICAgIGNoYW5uZWwsXG4gICAgICBvcHRpb25zLnF1ZXVlLFxuICAgICAgb3B0aW9ucy5tYXhUaW1lLFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gICAgcmV0dXJuIHN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW4oXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIG9wdGlvbnM/Lmdyb3VwXG4gICAgKTtcblxuICAgIGlmIChcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQuXG4gICAgICB2b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpXG4gICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy9cbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICovXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTsiLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICB9KVxuICB7XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxuICAgICAgdGhpcy5jbGVhbnVwLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNoZWNrSW50ZXJ2YWxcbiAgICApLnVucmVmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICBpZiAoIXJlc3VsdClcbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIGRhdGE6IFQsXG4gIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKVxuICB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fFxuICAgIGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8XG4gICAgdGhpcy5leHBpcmVBZnRlciA8IDEpXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICBxdWVyeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn0iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXlsaXN0LFxuICBUcmFjayxcbiAgU2VhcmNoUmVzdWx0LFxuICBTZWFyY2hPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhIH0gZnJvbVxuJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbVxuJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUXVlcnlSZXNvbHZlcixcbiAgUXVlcnlUeXBlLFxuICBSZXNvbHZlZFF1ZXJ5LFxuICBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tXG4nLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgQXVkaW9SZXNvdXJjZSxcbiAgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uLFxuICBTdHJlYW1UeXBlIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUsIFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IsIE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY29tbW9uJztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQge1xuICBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcixcbiAgdHlwZSBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMgfSBmcm9tXG4nLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gIHZvaWNlU3RhdGVVcGRhdGU6IChcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIG9sZFN0YXRlOiBWb2ljZVN0YXRlLFxuICBuZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbiAgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gIGRlYnVnOiAnZGVidWcnLFxuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgZXJyb3I6ICdlcnJvcicsXG4gIEVycm9yOiAnZXJyb3InLFxuICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJ1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IGFueT4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9XG5zdHJpbmcgfFxuVHJhY2sgfFxuU2VhcmNoUmVzdWx0IHxcblRyYWNrW10gfFxuUGxheWxpc3QgfFxuQXVkaW9SZXNvdXJjZTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxubmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSlcbj0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgKi9cbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICovXG4gIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gICAqL1xuICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgKi9cbiAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRdWVyeSBjYWNoZSBwcm92aWRlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgLyoqXG4gICAqIFNraXAgZmZtcGVnIHByb2Nlc3Mgd2hlbiBwb3NzaWJsZVxuICAgKi9cbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvYmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDUwMDAuXG4gICAqL1xuICBwcm9iZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgZmZtcGVnIHBhdGhcbiAgICovXG4gIGZmbXBlZ1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBmYWxsYmFjayBjb250ZXh0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBvdmVycmlkZUZhbGxiYWNrQ29udGV4dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAjbGFnTW9uaXRvclRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAjbGFnTW9uaXRvckludGVydmFsOiBOb2RlSlMuVGltZW91dDtcbiAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGRpc2NvcmQtcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9IGRwVmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIC8qKlxuICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG5vZGVzIChxdWV1ZSkgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIG5vZGVzID0gbmV3IEd1aWxkTm9kZU1hbmFnZXIodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZvaWNlVXRpbHMgPSBuZXcgVm9pY2VVdGlscyh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIG1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGV2ZW50cyBjaGFubmVsXG4gICAqL1xuICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oW1xuICBHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsXG4gIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl1cbiAgKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAjc3RyZWFtSW50ZXJjZXB0b3I6IFBsYXllclN0cmVhbUludGVyY2VwdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAqIEBwYXJhbSB7UGxheWVySW5pdE9wdGlvbnN9IFtvcHRpb25zXSBUaGUgcGxheWVyIGluaXQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoW1BsYXllckV2ZW50LkVycm9yXSk7XG5cbiAgICBpZiAob3B0aW9ucy5mZm1wZWdQYXRoKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aCAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgdHlwZSBcInN0cmluZ1wiIGZvciBvcHRpb25zLmZmbXBlZ1BhdGguIEdvdCAke3R5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGh9IGluc3RlYWRgXG4gICAgICApO1xuXG4gICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NvbXBhdE1vZGUgPSBpc0NsaWVudFByb3h5KGNsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZCBjbGllbnRcbiAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICBgQ2xpZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBkaXNjb3JkLmpzQCR7ZGpzVmVyc2lvbn0gY2xpZW50LCBzb21lIHRoaW5ncyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGNvcnJ1cHQgZGVwZW5kZW5jaWVzIG9yIGhhdmluZyBtdWx0aXBsZSBpbnN0YWxsYXRpb25zIG9mIGRpc2NvcmQuanMuYCxcbiAgICAgICAgICAgICdJbnZhbGlkQ2xpZW50SW5zdGFuY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGliZiA9XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZCA/XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyA6XG4gICAgICAgIG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsXG4gICAgICAgICAgICAnSW52YWxpZEludGVudHNCaXRGaWVsZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcblxuICAgICAgICAvLyBub29wXG4gICAgICB9fVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICBxdWVyeUNhY2hlOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID9cbiAgICAgIG51bGwgOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0OiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gc2F0aXNmaWVzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgIHRoaXMuY2xpZW50LmluY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgICAgdGhpcy5jbGllbnQub24oRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgICAgdGhpcy5jbGllbnQuX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5KHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIGF0dGFjaCB2b2ljZSBzdGF0ZSB1cGRhdGUgcHJveHksIHZvaWNlIHN0YXRlIGhhbmRsZXIgd2lsbCBub3Qgd29yayBwcm9wZXJseScsXG4gICAgICAgICAgJ0NvbXBhdE1vZGVFcnJvcidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgdHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJlxuICAgIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMClcbiAgICB7XG4gICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jbGFzdExhdGVuY3kgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChcbiAgICAgIEd1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgcXVldWUsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlXG4gICAgKTtcbiAgICAvLyBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIHJldHVybiBhc3N1bWluZyB0aGUgbGlzdGVuZXIgaW1wbGVtZW50ZWQgYWxsIG9mIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gcGFzc2luZyB2b2ljZSBzdGF0ZSB1cGRhdGUgZGF0YSB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdm9pY2Ugc3RhdGUgaGFuZGxlclxuICAgKlxuICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAqICAgLy8gdGhpcyBpcyBkZWZpbml0ZWx5IGEgcm9ja2V0IHNjaWVuY2UsIHJpZ2h0IGhlcmVcbiAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB2b2ljZSBzdGF0ZSBoYW5kbGVyIGlzIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgdHJhY2sgb3Igc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBxdWV1ZSBtYW5hZ2VtZW50LCBqdXN0IHVzZSB0aGlzIG1ldGhvZCBcdUQ4M0RcdURFMDRcbiAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAqIH0gY2F0Y2goZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gPSB7fSlcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgICdWb2ljZUJhc2VkQ2hhbm5lbCcsXG4gICAgICAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWBcbiAgICApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPVxuICAgIHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICBgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7XG4gICAgICAgIHJlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSlcbiAgICAgIGF3YWl0IHF1ZXVlLm5vZGUucGxheShudWxsLCBvcHRpb25zLmF1ZGlvUGxheWVyT3B0aW9ucyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goXG4gIHNlYXJjaFF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSlcbiAgOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgQXVkaW9SZXNvdXJjZSkge1xuICAgICAgc2VhcmNoUXVlcnkgPSB0aGlzLmNyZWF0ZVRyYWNrRnJvbUF1ZGlvUmVzb3VyY2Uoc2VhcmNoUXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpXG4gICAgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuXG4gICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnksXG4gICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUTztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YFxuICAgICk7XG5cbiAgICBpZiAoL15cXHcrOi8udGVzdChzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IFtwcm90b2NvbE5hbWUsIC4uLnF1ZXJ5XSA9IHNlYXJjaFF1ZXJ5LnNwbGl0KCc6Jyk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKFxuICAgICAgICAoZSkgPT5cbiAgICAgICAgIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiZcbiAgICAgICAgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKVxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWBcbiAgICAgICAgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/XG4gICAgICAnIGJ1dCBtaWdodCBub3QgYmUgdXNlZCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHByb3RvY29sJyA6XG4gICAgICAnJ31gXG5cbiAgICApO1xuXG4gICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYFxuICAgICk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yLlxuICAgIGhhbmRsZShxdWVyeSwge1xuICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgIHByb3RvY29sXG4gICAgfSkuXG4gICAgY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgJ0ZhaWxlZCB0byBmaW5kIHJlc3VsdCB1c2luZyBhcHByb3ByaWF0ZSBleHRyYWN0b3IuIFF1ZXJ5aW5nIGFsbCBleHRyYWN0b3JzLi4uJ1xuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJiAoXG4gICAgICBhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgZXh0LmhhbmRsZShxdWVyeSwge1xuICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgcHJvdG9jb2xcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtcbiAgICAgICAgcmVzdWx0Py5leHRyYWN0b3IuaWRlbnRpZmllciB8fCAnTi9BJ30gZXh0cmFjdG9yLmBcblxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID1cbiAgICAnQnVuJyBpbiBnbG9iYWxUaGlzID8gJ0J1bicgOiAnRGVubycgaW4gZ2xvYmFsVGhpcyA/ICdEZW5vJyA6ICdOb2RlJztcbiAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICdEaXNjb3JkIFBsYXllcicsXG4gICAgbGluZSxcbiAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn0ke1xuICAgIHRoaXMuaXNDb21wYXRNb2RlKCkgP1xuICAgIGAgKCR7Z2V0Q29tcGF0TmFtZSh0aGlzLmNsaWVudCl9IGNvbXBhdGliaWxpdHkgbW9kZSlgIDpcbiAgICAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlc291cmNlLm1ldGFkYXRhIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZWYgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtYXliZVRpdGxlID1cbiAgICAndGl0bGUnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGl0bGV9YCA6IGBUcmFjayAke3JlZn1gO1xuICAgIGNvbnN0IG1heWJlQXV0aG9yID1cbiAgICAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID1cbiAgICAnZHVyYXRpb24nIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuZHVyYXRpb259YCA6ICcwMDowMCc7XG4gICAgY29uc3QgbWF5YmVUaHVtYm5haWwgPVxuICAgICd0aHVtYm5haWwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGh1bWJuYWlsfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF5YmVVUkwgPVxuICAgICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9XG4gICAgJ2Rlc2NyaXB0aW9uJyBpbiBtZXRhZGF0YSA/XG4gICAgYCR7bWV0YWRhdGEuZGVzY3JpcHRpb259YCA6XG4gICAgJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW50ZXJjZXB0aW5nIHN0cmVhbXNcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIGludGVyY2VwdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIHRyYWNrOiBUcmFjayxcbiAgZm9ybWF0OiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICB7XG4gICAgaWYgKCF0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yLmhhbmRsZShxdWV1ZSwgdHJhY2ssIGZvcm1hdCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2xvYmFsIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW1JbnRlcmNlcHRvcihvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgICB9XG5cbiAgICB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvciA9IG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgfVxufSIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcblxuZnVuY3Rpb24gaGFuZGxlRW1wdHlDaGFubmVsKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbmd1aWxkSWQ6IHN0cmluZylcbntcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSlcbiAgICByZXR1cm47XG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtndWlsZElkfWAsIHRpbWVvdXQpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVDaGFubmVsUG9wdWxhdGUoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke2d1aWxkSWR9YCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXVzZU9uRW1wdHkocXVldWU6IEd1aWxkUXVldWUpIHtcbiAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgY29uc3Qgd2FzUGF1c2VkT25FbXB0eSA9IFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5Jyk7XG5cbiAgaWYgKGlzRW1wdHkgJiYgIXdhc1BhdXNlZE9uRW1wdHkpIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWlzRW1wdHkgJiYgd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIGZhbHNlKTtcbiAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHF1ZXVlLmRlYnVnKFxuICAgICAgICAnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxub2xkU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbntcbiAgaWYgKFxuICBuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSlcbiAge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChcbiAgbmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmXG4gIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcihcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoIXF1ZXVlPy5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgY29uc3QgaXNCb3RTdGF0ZSA9IG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkO1xuICBjb25zdCBndWlsZElkID0gb2xkU3RhdGUuZ3VpbGQuaWQ7XG5cbiAgLy8gQm90IGRpc2Nvbm5lY3RlZFxuICBpZiAoaXNCb3RTdGF0ZSAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgJiYgIW5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIHRyeSB7XG4gICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgfVxuXG4gIGlmIChxdWV1ZS5vcHRpb25zLnBhdXNlT25FbXB0eSkge1xuICAgIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZSk7XG4gIH1cblxuICAvLyBCb3Qgam9pbmVkIGNoYW5uZWwgb3IgY2hhbmdlZCBzdGF0ZVxuICBpZiAoXG4gIGlzQm90U3RhdGUgJiZcbiAgbmV3U3RhdGUuY2hhbm5lbElkICYmIChcbiAgIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpXG4gIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAoXG4gICAgbmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmXG4gICAgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKVxuXG4gICAgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihcbiAgZGlyOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIpXG4gIDogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIGNvbnN0IG5leHQgPSAoKSA9PlxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgcmVzb2x2ZShkaXIsICcuLicpLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgICBkZXB0aCAtIDFcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFRyaWVzIHRvIGZpbmQgdGhlIHZlcnNpb24gb2YgYSBkZXBlbmRlbmN5LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHJldHVybnMgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihcbiAgICAgICAgZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtYXhMb29rdXBEZXB0aFxuICAgICAgKTtcbiAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICovXG4gIGdlbmVyYXRlKCk6IERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgaWYgKGZmbXBlZykge1xuICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgdmVyc2lvbjogZmZtcGVnLnZlcnNpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcmU6IHtcbiAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdkaXNjb3JkLXBsYXllcidcbiAgICAgICAgKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtdm9pcCdcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgIH0sXG4gICAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgJ0BkaXNjb3JkanMvb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGRpc2NvcmRqcy9vcHVzJyksXG4gICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAnbm9kZS1vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdub2RlLW9wdXMnKVxuICAgICAgfSxcbiAgICAgIGxpYnNvZGl1bToge1xuICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLW5hdGl2ZScpLFxuICAgICAgICBzb2RpdW06IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtJyksXG4gICAgICAgICdsaWJzb2RpdW0td3JhcHBlcnMnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2xpYnNvZGl1bS13cmFwcGVycycpLFxuICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSdcbiAgICAgICAgKSxcbiAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzpcbiAgICAgICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAnQG5vYmVsL2NpcGhlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0Bub2JlbC9jaXBoZXJzJylcbiAgICAgIH0sXG4gICAgICBmZm1wZWc6IGZmbXBlZ1JlcG9ydFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcGVuZGVuY2llcyByZXBvcnQuXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGdlbmVyYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb3J0ID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcblxuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAgIG91dHB1dC5wdXNoKCdEZXBlbmRlbmNpZXMgUmVwb3J0Jyk7XG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVwb3J0KSBhcyAoa2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0KVtdO1xuXG4gICAgZm9yIChjb25zdCBfa2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IF9rZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0O1xuXG4gICAgICBvdXRwdXQucHVzaChrZXkpO1xuXG4gICAgICBjb25zdCBzdWJLZXlzID0gT2JqZWN0LmtleXMocmVwb3J0W2tleV0pO1xuXG4gICAgICBmb3IgKGNvbnN0IF9zdWJLZXkgb2Ygc3ViS2V5cykge1xuICAgICAgICBjb25zdCBzdWJLZXkgPSBfc3ViS2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydFt0eXBlb2Yga2V5XTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXBvcnRba2V5XVtzdWJLZXldID8/ICdOL0EnO1xuXG4gICAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICAgIGAtICR7c3ViS2V5fTogJHtcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpIDogdmFsdWV9YFxuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cbn07IiwgIlxuXG5cblxuXG5cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gLyogQF9fTUFDUk9fXyBnZXRWZXJzaW9uICovXCI3LjIuMC1kZXYuMFwiOyIsICJpbXBvcnQgeyBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcblxudHlwZSBBd2FpdGFibGU8VD4gPSBUIHwgUHJvbWlzZUxpa2U8VD47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbiA9IDxUID0gYW55PihcbnF1ZXVlOiBHdWlsZFF1ZXVlPFQ+LFxudHJhY2s6IFRyYWNrLFxuZm9ybWF0OiBTdHJlYW1UeXBlLFxuc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbj0+IEF3YWl0YWJsZTxib29sZWFuPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW50ZXJjZXB0ZWQuXG4gICAqL1xuICBzaG91bGRJbnRlcmNlcHQ/OiBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllclN0cmVhbUludGVyY2VwdG9yIHtcbiAgI29uU3RyZWFtID0gbmV3IFNldDxPbkludGVyY2VwdGVkU3RyZWFtSGFuZGxlcj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBpbnRlcmNlcHRvciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpXG4gIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGludGVyY2VwdGVkIHN0cmVhbS5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBndWlsZCBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGludGVyY2VwdGVkIHN0cmVhbVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzdHJlYW0gd2FzIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlPFQgPSB1bmtub3duPihcbiAgcXVldWU6IEd1aWxkUXVldWU8VD4sXG4gIHRyYWNrOiBUcmFjayxcbiAgdHlwZTogU3RyZWFtVHlwZSxcbiAgc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuc2hvdWxkSW50ZXJjZXB0O1xuXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlsdGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKTtcbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy4jb25TdHJlYW0uc2l6ZTtcblxuICAgIGlmICghaGFzTGlzdGVuZXJzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50aGlzLiNvblN0cmVhbV0ubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBpbnRlcmNlcHRlZCBzdHJlYW0gbGlzdGVuZXIuXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIG9uU3RyZWFtKGhhbmRsZXI6IE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy4jb25TdHJlYW0uYWRkKGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuI29uU3RyZWFtLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNINUMsSUFBTSw0QkFBNEIsT0FBTyxxQkFBcUI7QUFTOUQsU0FBUyxtQkFBbUIsUUFBYSxVQUF3QztBQUN0RixVQUFRLElBQUksUUFBUSwyQkFBMkIsUUFBUTtBQUN2RCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFOZ0I7QUFRVCxTQUFTLGNBQWMsUUFBc0I7QUFDbEQsU0FBTyxRQUFRLElBQUksUUFBUSx5QkFBeUIsS0FB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QUFBQyx1QkFXQTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJTZXJpYWxpemVkVHlwZSIsICJxdWVyeSIsICJ2ZXJzaW9uIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3YxMCIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImRlY2xhcmVQcm9wZXJ0eSIsICJnZXRQcm9wZXJ0eSIsICJtb2R1bGUiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgInJlc3VsdCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJyZXNvbHZlIiwgInJlc29sdmUiLCAid2FpdEZvciIsICJpbXBvcnRfZXF1YWxpemVyIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJkanNWZXJzaW9uIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==
|