sliftutils 1.7.71 → 1.7.73
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/index.d.ts +506 -257
- package/misc/https/dist/hostServer.ts.cache +5 -2
- package/package.json +1 -1
- package/spec.txt +10 -0
- package/storage/ArchivesDisk.d.ts +4 -13
- package/storage/ArchivesDisk.ts +6 -4
- package/storage/IArchives.d.ts +15 -10
- package/storage/IArchives.ts +19 -6
- package/storage/backblaze.d.ts +3 -9
- package/storage/backblaze.ts +22 -19
- package/storage/dist/ArchivesDisk.ts.cache +5 -2
- package/storage/dist/IArchives.ts.cache +17 -3
- package/storage/dist/backblaze.ts.cache +35 -26
- package/storage/remoteStorage/ArchivesRemote.d.ts +5 -9
- package/storage/remoteStorage/ArchivesRemote.ts +25 -20
- package/storage/remoteStorage/ArchivesUrl.d.ts +3 -9
- package/storage/remoteStorage/ArchivesUrl.ts +7 -5
- package/storage/remoteStorage/accessPage.tsx +4 -4
- package/storage/remoteStorage/accessStats.d.ts +2 -0
- package/storage/remoteStorage/accessStats.ts +32 -0
- package/storage/remoteStorage/blobStore.d.ts +193 -88
- package/storage/remoteStorage/blobStore.ts +535 -400
- package/storage/remoteStorage/bucketDisk.d.ts +18 -0
- package/storage/remoteStorage/bucketDisk.ts +66 -0
- package/storage/remoteStorage/createArchives.d.ts +4 -10
- package/storage/remoteStorage/createArchives.ts +103 -62
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +28 -19
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +7 -4
- package/storage/remoteStorage/dist/accessPage.tsx.cache +6 -6
- package/storage/remoteStorage/dist/accessStats.ts.cache +38 -3
- package/storage/remoteStorage/dist/blobStore.ts.cache +516 -374
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +72 -0
- package/storage/remoteStorage/dist/createArchives.ts.cache +114 -57
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +12 -12
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +18 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +116 -0
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +6 -5
- package/storage/remoteStorage/dist/sourcesList.ts.cache +5 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +223 -190
- package/storage/remoteStorage/dist/storageServer.ts.cache +9 -9
- package/storage/remoteStorage/dist/storageServerState.ts.cache +329 -566
- package/storage/remoteStorage/dist/storePlan.ts.cache +149 -0
- package/storage/remoteStorage/dist/validation.ts.cache +40 -0
- package/storage/remoteStorage/grantAccessCli.ts +1 -1
- package/storage/remoteStorage/intermediateSources.d.ts +3 -5
- package/storage/remoteStorage/intermediateSources.ts +14 -16
- package/storage/remoteStorage/remoteConfig.d.ts +2 -2
- package/storage/remoteStorage/remoteConfig.ts +19 -3
- package/storage/remoteStorage/serverConfig.d.ts +27 -0
- package/storage/remoteStorage/serverConfig.ts +109 -0
- package/storage/remoteStorage/sourceWrapper.d.ts +3 -3
- package/storage/remoteStorage/sourceWrapper.ts +7 -6
- package/storage/remoteStorage/sourcesList.ts +3 -0
- package/storage/remoteStorage/storageController.d.ts +118 -36
- package/storage/remoteStorage/storageController.ts +166 -168
- package/storage/remoteStorage/storageServer.ts +1 -1
- package/storage/remoteStorage/storageServerState.d.ts +52 -63
- package/storage/remoteStorage/storageServerState.ts +340 -584
- package/storage/remoteStorage/storePlan.d.ts +34 -0
- package/storage/remoteStorage/storePlan.ts +166 -0
- package/storage/remoteStorage/validation.d.ts +4 -0
- package/storage/remoteStorage/validation.ts +31 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
2
8
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
9
|
//exports.RemoteStorageController = exports.broadcastRoutingChanged = exports.STORAGE_ACCESS_DENIED = exports.STORAGE_NOT_AUTHENTICATED = exports.STORAGE_AUTH_PURPOSE = exports.REMOTE_STORAGE_CLASS_GUID = void 0;
|
|
4
10
|
const SocketFunction_1 = require("socket-function/SocketFunction");
|
|
@@ -11,8 +17,11 @@ const certs_1 = require("../../misc/https/certs");
|
|
|
11
17
|
const IArchives_1 = require("../IArchives");
|
|
12
18
|
const remoteConfig_1 = require("./remoteConfig");
|
|
13
19
|
const storageServerState_1 = require("./storageServerState");
|
|
20
|
+
const serverConfig_1 = require("./serverConfig");
|
|
21
|
+
const bucketDisk_1 = require("./bucketDisk");
|
|
14
22
|
const storageClientController_1 = require("./storageClientController");
|
|
15
23
|
const accessStats_1 = require("./accessStats");
|
|
24
|
+
const validation_1 = require("./validation");
|
|
16
25
|
exports.REMOTE_STORAGE_CLASS_GUID = "RemoteStorageController-b7e42a91";
|
|
17
26
|
exports.STORAGE_AUTH_PURPOSE = "remoteStorage-auth-1";
|
|
18
27
|
exports.STORAGE_NOT_AUTHENTICATED = "REMOTE_STORAGE_NOT_AUTHENTICATED_cf2f7b1e";
|
|
@@ -29,22 +38,6 @@ const CONTENT_TYPES = {
|
|
|
29
38
|
webp: "image/webp", mp4: "video/mp4", webm: "video/webm",
|
|
30
39
|
mp3: "audio/mpeg", wav: "audio/wav", pdf: "application/pdf",
|
|
31
40
|
};
|
|
32
|
-
function assertValidName(value, kind) {
|
|
33
|
-
if (!/^[\w-]{1,64}$/.test(value)) {
|
|
34
|
-
throw new Error(`Invalid ${kind} ${JSON.stringify(value)}, expected 1-64 characters of letters/numbers/underscore/dash`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function assertValidPath(path) {
|
|
38
|
-
if (Buffer.from(path, "utf8").length > 1000) {
|
|
39
|
-
throw new Error(`Path too long: ${path.length} characters > 1000. Path: ${path.slice(0, 200)}`);
|
|
40
|
-
}
|
|
41
|
-
if (!path || path.startsWith("/") || path.endsWith("/") || path.includes("//") || path.includes("\\") || path.includes("\x00")) {
|
|
42
|
-
throw new Error(`Invalid path ${JSON.stringify(path.slice(0, 200))}, paths cannot be empty, start or end with /, or contain //, backslashes, or null characters`);
|
|
43
|
-
}
|
|
44
|
-
if (path.split("/").some(part => part === "." || part === "..")) {
|
|
45
|
-
throw new Error(`Invalid path ${JSON.stringify(path.slice(0, 200))}, paths cannot contain . or .. segments`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
41
|
const connectedClients = new Set();
|
|
49
42
|
function trackCaller() {
|
|
50
43
|
let nodeId = SocketFunction_1.SocketFunction.getCaller().nodeId;
|
|
@@ -74,7 +67,7 @@ function getCallerIP() {
|
|
|
74
67
|
return (0, nodeCache_1.getNodeIdIP)(SocketFunction_1.SocketFunction.getCaller().nodeId);
|
|
75
68
|
}
|
|
76
69
|
function isAdmin(machineId) {
|
|
77
|
-
return machineId === (0, certs_1.getOwnMachineId)((0,
|
|
70
|
+
return machineId === (0, certs_1.getOwnMachineId)((0, serverConfig_1.getStorageServerConfig)().rootDomain);
|
|
78
71
|
}
|
|
79
72
|
function requireAdmin() {
|
|
80
73
|
let machineId = getCallerMachineId();
|
|
@@ -84,34 +77,29 @@ function requireAdmin() {
|
|
|
84
77
|
return machineId;
|
|
85
78
|
}
|
|
86
79
|
async function requireAccess(account) {
|
|
87
|
-
assertValidName(account, "account");
|
|
80
|
+
(0, validation_1.assertValidName)(account, "account");
|
|
88
81
|
let machineId = getCallerMachineId();
|
|
89
82
|
if (isAdmin(machineId))
|
|
90
83
|
return machineId;
|
|
91
|
-
let trust = await (0,
|
|
84
|
+
let trust = await (0, serverConfig_1.getTrust)();
|
|
92
85
|
let trusted = await trust.get(`${account}|${machineId}`);
|
|
93
86
|
if (!trusted) {
|
|
94
|
-
let { domain, port } = (0,
|
|
87
|
+
let { domain, port } = (0, serverConfig_1.getStorageServerConfig)();
|
|
95
88
|
throw new Error(`${exports.STORAGE_ACCESS_DENIED} Machine ${machineId} has no access to account ${JSON.stringify(account)}. Visit https://${domain}:${port}/${account} for access instructions.`);
|
|
96
89
|
}
|
|
97
90
|
return machineId;
|
|
98
91
|
}
|
|
99
92
|
function getGrantAccessCommand(requestId) {
|
|
100
|
-
let { sshTarget, serverCommand } = (0,
|
|
93
|
+
let { sshTarget, serverCommand } = (0, serverConfig_1.getStorageServerConfig)();
|
|
101
94
|
return `ssh ${sshTarget} '${serverCommand} --requestId ${requestId}'`;
|
|
102
95
|
}
|
|
103
|
-
async function getBucket(account, bucketName) {
|
|
104
|
-
assertValidName(account, "account");
|
|
105
|
-
assertValidName(bucketName, "bucket name");
|
|
106
|
-
return await (0, storageServerState_1.getLoadedBucket)(account, bucketName);
|
|
107
|
-
}
|
|
108
96
|
class RemoteStorageControllerBase {
|
|
109
97
|
async ping() {
|
|
110
98
|
trackCaller();
|
|
111
99
|
return {};
|
|
112
100
|
}
|
|
113
101
|
async authenticate(token) {
|
|
114
|
-
let { domain, port } = (0,
|
|
102
|
+
let { domain, port } = (0, serverConfig_1.getStorageServerConfig)();
|
|
115
103
|
let caller = SocketFunction_1.SocketFunction.getCaller();
|
|
116
104
|
(0, certs_1.verify)(token.certPem, token.signature, token.data);
|
|
117
105
|
let { purpose, time, server } = token.data;
|
|
@@ -138,11 +126,11 @@ class RemoteStorageControllerBase {
|
|
|
138
126
|
}
|
|
139
127
|
return { machineId, ip: getCallerIP() };
|
|
140
128
|
}
|
|
141
|
-
async requestAccess(
|
|
142
|
-
|
|
129
|
+
async requestAccess(config) {
|
|
130
|
+
let account = config.account;
|
|
143
131
|
let machineId = getCallerMachineId();
|
|
144
132
|
let ip = getCallerIP();
|
|
145
|
-
let requestsStorage = await (0,
|
|
133
|
+
let requestsStorage = await (0, serverConfig_1.getRequests)();
|
|
146
134
|
let requests = await requestsStorage.get(ip) || [];
|
|
147
135
|
let existing = requests.find(x => x.account === account && x.machineId === machineId);
|
|
148
136
|
if (existing) {
|
|
@@ -163,15 +151,15 @@ class RemoteStorageControllerBase {
|
|
|
163
151
|
await requestsStorage.set(ip, requests);
|
|
164
152
|
return { machineId, ip, requestId: existing.requestId, grantAccessCommand: getGrantAccessCommand(existing.requestId) };
|
|
165
153
|
}
|
|
166
|
-
async getAccessState(
|
|
167
|
-
|
|
154
|
+
async getAccessState(config) {
|
|
155
|
+
let account = config.account;
|
|
168
156
|
let machineId = getCallerMachineId();
|
|
169
157
|
let ip = getCallerIP();
|
|
170
|
-
let trust = await (0,
|
|
158
|
+
let trust = await (0, serverConfig_1.getTrust)();
|
|
171
159
|
let hasAccess = isAdmin(machineId) || !!await trust.get(`${account}|${machineId}`);
|
|
172
160
|
let result = { machineId, ip, hasAccess };
|
|
173
161
|
if (!hasAccess) {
|
|
174
|
-
let requests = await (0,
|
|
162
|
+
let requests = await (0, serverConfig_1.getRequests)();
|
|
175
163
|
let ownRequest = (await requests.get(ip) || []).find(x => x.account === account && x.machineId === machineId);
|
|
176
164
|
if (ownRequest) {
|
|
177
165
|
result.grantAccessCommand = getGrantAccessCommand(ownRequest.requestId);
|
|
@@ -189,14 +177,15 @@ class RemoteStorageControllerBase {
|
|
|
189
177
|
result.trustedMachines = trustedMachines;
|
|
190
178
|
return result;
|
|
191
179
|
}
|
|
192
|
-
async listRequestsForIP(
|
|
193
|
-
let requests = await (0,
|
|
194
|
-
return (await requests.get(ip) || []).filter(x => x.account === account);
|
|
180
|
+
async listRequestsForIP(config) {
|
|
181
|
+
let requests = await (0, serverConfig_1.getRequests)();
|
|
182
|
+
return (await requests.get(config.ip) || []).filter(x => x.account === config.account);
|
|
195
183
|
}
|
|
196
|
-
async grantAccess(
|
|
184
|
+
async grantAccess(config) {
|
|
185
|
+
let requestId = config.requestId;
|
|
197
186
|
let callerMachineId = getCallerMachineId();
|
|
198
|
-
let trust = await (0,
|
|
199
|
-
let requests = await (0,
|
|
187
|
+
let trust = await (0, serverConfig_1.getTrust)();
|
|
188
|
+
let requests = await (0, serverConfig_1.getRequests)();
|
|
200
189
|
for (let ip of await requests.getKeys()) {
|
|
201
190
|
for (let request of await requests.get(ip) || []) {
|
|
202
191
|
if (request.requestId !== requestId)
|
|
@@ -220,13 +209,14 @@ class RemoteStorageControllerBase {
|
|
|
220
209
|
async adminListActiveBuckets() {
|
|
221
210
|
return (0, storageServerState_1.getActiveBucketKeys)();
|
|
222
211
|
}
|
|
223
|
-
async adminListRequests(
|
|
224
|
-
let requests = await (0,
|
|
225
|
-
return await requests.get(ip) || [];
|
|
212
|
+
async adminListRequests(config) {
|
|
213
|
+
let requests = await (0, serverConfig_1.getRequests)();
|
|
214
|
+
return await requests.get(config.ip) || [];
|
|
226
215
|
}
|
|
227
|
-
async adminGrantAccess(
|
|
228
|
-
let
|
|
229
|
-
let
|
|
216
|
+
async adminGrantAccess(config) {
|
|
217
|
+
let requestId = config.requestId;
|
|
218
|
+
let trust = await (0, serverConfig_1.getTrust)();
|
|
219
|
+
let requests = await (0, serverConfig_1.getRequests)();
|
|
230
220
|
for (let ip of await requests.getKeys()) {
|
|
231
221
|
for (let request of await requests.get(ip) || []) {
|
|
232
222
|
if (request.requestId !== requestId)
|
|
@@ -243,172 +233,122 @@ class RemoteStorageControllerBase {
|
|
|
243
233
|
}
|
|
244
234
|
throw new Error(`No access request found with id ${JSON.stringify(requestId)}. It may have already been granted or expired.`);
|
|
245
235
|
}
|
|
246
|
-
async
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
async get2(account, bucketName, path, range, internal) {
|
|
251
|
-
assertValidPath(path);
|
|
252
|
-
let bucket = await getBucket(account, bucketName);
|
|
253
|
-
let result;
|
|
254
|
-
if (bucket) {
|
|
255
|
-
if (internal && bucket.store.getInternal2) {
|
|
256
|
-
result = await bucket.store.getInternal2(path, { range });
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
result = await bucket.store.get2(path, { range });
|
|
260
|
-
}
|
|
236
|
+
async get2(config) {
|
|
237
|
+
if (config.path === remoteConfig_1.ROUTING_FILE) {
|
|
238
|
+
// The routing file lives outside every store and even outside the bucket (it is what CREATES it), so it is read straight off the disk - absent means undefined, exactly like any file read
|
|
239
|
+
return await (0, bucketDisk_1.getRoutingFileResult)(config.account, config.bucketName);
|
|
261
240
|
}
|
|
262
|
-
(
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
async set(account, bucketName, path, data, lastModified, forceSetImmutable, internal) {
|
|
266
|
-
assertValidName(bucketName, "bucket name");
|
|
267
|
-
assertValidPath(path);
|
|
268
|
-
if (!data.length) {
|
|
269
|
-
throw new Error(`set was called with an empty buffer for ${JSON.stringify(path)} in bucket ${account}/${bucketName}: an empty file IS a deletion in this system and would read back as missing - call del instead`);
|
|
270
|
-
}
|
|
271
|
-
(0, accessStats_1.trackAccess)({ account, operation: "set", path: `${bucketName}/${path}`, size: data.length });
|
|
272
|
-
await (0, storageServerState_1.writeBucketFile)(account, bucketName, path, Buffer.from(data), { lastModified, forceSetImmutable, internal });
|
|
273
|
-
}
|
|
274
|
-
async del(account, bucketName, path, lastModified, internal) {
|
|
275
|
-
assertValidName(bucketName, "bucket name");
|
|
276
|
-
assertValidPath(path);
|
|
277
|
-
(0, accessStats_1.trackAccess)({ account, operation: "del", path: `${bucketName}/${path}` });
|
|
278
|
-
await (0, storageServerState_1.deleteBucketFile)(account, bucketName, path, { lastModified, internal });
|
|
279
|
-
}
|
|
280
|
-
async getInfo(account, bucketName, path, includeTombstones) {
|
|
281
|
-
assertValidPath(path);
|
|
282
|
-
(0, accessStats_1.trackAccess)({ account, operation: "getInfo", path: `${bucketName}/${path}` });
|
|
283
|
-
let bucket = await getBucket(account, bucketName);
|
|
284
|
-
if (!bucket)
|
|
285
|
-
return undefined;
|
|
286
|
-
return await bucket.store.getInfo(path, { includeTombstones });
|
|
287
|
-
}
|
|
288
|
-
async findInfo(account, bucketName, prefix, config) {
|
|
289
|
-
let bucket = await getBucket(account, bucketName);
|
|
290
|
-
let results = bucket && await bucket.store.findInfo(prefix, config) || [];
|
|
291
|
-
// The paths are only known once the results are in; an empty result still counts as one access at the prefix.
|
|
292
|
-
if (results.length) {
|
|
293
|
-
for (let info of results) {
|
|
294
|
-
(0, accessStats_1.trackAccess)({ account, operation: "findInfo", path: `${bucketName}/${info.path}` });
|
|
295
|
-
}
|
|
241
|
+
if (config.internal) {
|
|
242
|
+
return await (0, storageServerState_1.readBucketInternal)(config.account, config.bucketName, config);
|
|
296
243
|
}
|
|
297
|
-
|
|
298
|
-
|
|
244
|
+
return await withStore(config, store => store.get2(config));
|
|
245
|
+
}
|
|
246
|
+
async set(config) {
|
|
247
|
+
(0, serverConfig_1.assertWritesAllowed)();
|
|
248
|
+
// Copied because the wire hands us a plain Uint8Array view, not a real Buffer
|
|
249
|
+
let data = Buffer.from(config.data);
|
|
250
|
+
if (config.path === remoteConfig_1.ROUTING_FILE) {
|
|
251
|
+
return await (0, storageServerState_1.queueRoutingConfigWrite)(config.account, config.bucketName, data, config);
|
|
299
252
|
}
|
|
300
|
-
|
|
253
|
+
await withStore(config, store => store.set({ ...config, data }));
|
|
301
254
|
}
|
|
302
|
-
async
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
(0,
|
|
255
|
+
async del(config) {
|
|
256
|
+
(0, serverConfig_1.assertWritesAllowed)();
|
|
257
|
+
await withStore(config, store => store.del(config));
|
|
258
|
+
}
|
|
259
|
+
async getInfo(config) {
|
|
260
|
+
if (config.path === remoteConfig_1.ROUTING_FILE) {
|
|
261
|
+
let result = await (0, bucketDisk_1.getRoutingFileResult)(config.account, config.bucketName);
|
|
262
|
+
return result && { writeTime: result.writeTime, size: result.size } || undefined;
|
|
309
263
|
}
|
|
310
|
-
return
|
|
264
|
+
return await withStore(config, store => store.getInfo(config));
|
|
311
265
|
}
|
|
312
|
-
async
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
return (
|
|
266
|
+
async findInfo(config) {
|
|
267
|
+
return await withStore(config, store => store.findInfo(config));
|
|
268
|
+
}
|
|
269
|
+
async getChangesAfter2(config) {
|
|
270
|
+
return await withStore(config, store => store.getChangesAfter2(config));
|
|
271
|
+
}
|
|
272
|
+
async getArchivesConfig(config) {
|
|
273
|
+
return (0, storageServerState_1.getBucketConfig)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
|
|
317
274
|
}
|
|
318
|
-
async listBuckets(
|
|
275
|
+
async listBuckets(config) {
|
|
319
276
|
let start = Date.now();
|
|
320
277
|
try {
|
|
321
|
-
return await (0, storageServerState_1.listAccountBuckets)(account);
|
|
278
|
+
return await (0, storageServerState_1.listAccountBuckets)(config.account);
|
|
322
279
|
}
|
|
323
280
|
finally {
|
|
324
281
|
// The access hook (and the storage it initializes) runs before this, so a large gap between this and the caller's timing is the hook
|
|
325
|
-
console.log(`listBuckets(${account}) call body took ${Date.now() - start}ms`);
|
|
282
|
+
console.log(`listBuckets(${config.account}) call body took ${Date.now() - start}ms`);
|
|
326
283
|
}
|
|
327
284
|
}
|
|
328
285
|
/** The live, in-memory state of one bucket, or a string saying why it is unavailable. Answered without touching the disk, so it is cheap - but only works while the bucket is loaded here. */
|
|
329
|
-
async getActiveBucket(
|
|
330
|
-
|
|
331
|
-
return await (0, storageServerState_1.getActiveBucket)(account, bucketName);
|
|
286
|
+
async getActiveBucket(config) {
|
|
287
|
+
return await (0, storageServerState_1.getActiveBucket)(config.account, config.bucketName);
|
|
332
288
|
}
|
|
333
289
|
/** Loads a bucket that exists on this server into memory (starting its synchronization) and returns its live state, or a string saying why it could not be loaded. */
|
|
334
|
-
async activateBucket(
|
|
335
|
-
|
|
336
|
-
return await (0, storageServerState_1.activateBucket)(account, bucketName);
|
|
290
|
+
async activateBucket(config) {
|
|
291
|
+
return await (0, storageServerState_1.activateBucket)(config.account, config.bucketName);
|
|
337
292
|
}
|
|
338
293
|
/** Zeroes the write statistics listBuckets reports and the in-memory access statistics, for every bucket in the account. */
|
|
339
|
-
async clearWriteStats(
|
|
340
|
-
|
|
341
|
-
(0,
|
|
342
|
-
return { clearedBuckets: (0, storageServerState_1.clearAccountWriteStats)(account) };
|
|
294
|
+
async clearWriteStats(config) {
|
|
295
|
+
(0, accessStats_1.clearAccountAccessStats)(config.account);
|
|
296
|
+
return { clearedBuckets: (0, storageServerState_1.clearAccountWriteStats)(config.account) };
|
|
343
297
|
}
|
|
344
298
|
/** In-memory totals per operation type since startup (or the last clearWriteStats). */
|
|
345
|
-
async getAccessStats(
|
|
346
|
-
|
|
347
|
-
return (0, accessStats_1.getAccessTotals)(account);
|
|
299
|
+
async getAccessStats(config) {
|
|
300
|
+
return (0, accessStats_1.getAccessTotals)(config.account);
|
|
348
301
|
}
|
|
349
302
|
/** A path breakdown of one operation's accesses (operation names come from getAccessStats). maxCount is passed straight to TreeSummary.getSummaries. weightBySize is ignored for count-only operations, which return their count breakdown. */
|
|
350
|
-
async getAccessSummaries(
|
|
351
|
-
|
|
352
|
-
return (0, accessStats_1.readAccessSummaries)({ account, ...config });
|
|
353
|
-
}
|
|
354
|
-
async getIndexInfo(account, bucketName) {
|
|
355
|
-
let bucket = await getBucket(account, bucketName);
|
|
356
|
-
if (!bucket || !bucket.store.computeIndexTotals)
|
|
357
|
-
return undefined;
|
|
358
|
-
return await bucket.store.computeIndexTotals();
|
|
359
|
-
}
|
|
360
|
-
async getSyncStatus(account, bucketName) {
|
|
361
|
-
let bucket = await getBucket(account, bucketName);
|
|
362
|
-
if (!bucket)
|
|
363
|
-
return { allScansComplete: true, indexSize: 0, sources: [] };
|
|
364
|
-
if (!bucket.store.getSyncStatus) {
|
|
365
|
-
throw new Error(`Bucket ${account}/${bucketName} does not support getSyncStatus (rawDisk buckets have no synchronization)`);
|
|
366
|
-
}
|
|
367
|
-
return await bucket.store.getSyncStatus();
|
|
303
|
+
async getAccessSummaries(config) {
|
|
304
|
+
return (0, accessStats_1.readAccessSummaries)(config);
|
|
368
305
|
}
|
|
369
|
-
async
|
|
370
|
-
(0, storageServerState_1.
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
let
|
|
378
|
-
|
|
306
|
+
async getIndexInfo(config) {
|
|
307
|
+
return await (0, storageServerState_1.bucketIndexTotals)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
|
|
308
|
+
}
|
|
309
|
+
async getSyncStatus(config) {
|
|
310
|
+
return await (0, storageServerState_1.bucketSyncStatus)(await (0, storageServerState_1.requireBucket)(config.account, config.bucketName));
|
|
311
|
+
}
|
|
312
|
+
async startLargeFile(config) {
|
|
313
|
+
(0, serverConfig_1.assertWritesAllowed)();
|
|
314
|
+
let target = await (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
|
|
315
|
+
let id = await target.store.startLargeUpload({ path: config.path, lastModified: config.lastModified });
|
|
316
|
+
// routeKey pins the upload's parts and finish to the same store the start picked (in-flight uploads survive a bucket rebuild: the part data lives in the store's folder, which a rebuilt store still sees)
|
|
317
|
+
largeUploadInfo.set(id, { account: config.account, bucketName: config.bucketName, path: config.path, lastModified: config.lastModified, routeKey: target.routeKey });
|
|
379
318
|
return id;
|
|
380
319
|
}
|
|
381
|
-
async uploadPart(
|
|
382
|
-
(0,
|
|
383
|
-
let info = largeUploadInfo.get(uploadId);
|
|
320
|
+
async uploadPart(config) {
|
|
321
|
+
(0, serverConfig_1.assertWritesAllowed)();
|
|
322
|
+
let info = largeUploadInfo.get(config.uploadId);
|
|
384
323
|
if (!info)
|
|
385
|
-
throw new Error(`Unknown large upload ${uploadId}`);
|
|
386
|
-
(0, accessStats_1.trackAccess)({ account: info.account, operation: "uploadPart", path: `${info.bucketName}/${info.path}`, size: data.length });
|
|
387
|
-
let
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
(0, storageServerState_1.assertWritesAllowed)();
|
|
394
|
-
let info = largeUploadInfo.get(uploadId);
|
|
324
|
+
throw new Error(`Unknown large upload ${config.uploadId}`);
|
|
325
|
+
(0, accessStats_1.trackAccess)({ account: info.account, operation: "uploadPart", path: `${info.bucketName}/${info.path}`, size: config.data.length });
|
|
326
|
+
let target = await findUploadStore(info);
|
|
327
|
+
await target.store.appendLargeUpload({ id: config.uploadId, data: Buffer.from(config.data) });
|
|
328
|
+
}
|
|
329
|
+
async finishLargeFile(config) {
|
|
330
|
+
(0, serverConfig_1.assertWritesAllowed)();
|
|
331
|
+
let info = largeUploadInfo.get(config.uploadId);
|
|
395
332
|
if (!info)
|
|
396
|
-
throw new Error(`Unknown large upload ${uploadId}`);
|
|
397
|
-
largeUploadInfo.delete(uploadId);
|
|
398
|
-
let
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
let info = largeUploadInfo.get(uploadId);
|
|
333
|
+
throw new Error(`Unknown large upload ${config.uploadId}`);
|
|
334
|
+
largeUploadInfo.delete(config.uploadId);
|
|
335
|
+
let target = await findUploadStore(info);
|
|
336
|
+
await target.store.finishLargeUpload({ id: config.uploadId, path: info.path, lastModified: info.lastModified });
|
|
337
|
+
}
|
|
338
|
+
/** Best-effort cleanup: an upload whose bucket or store has since vanished has nothing left to cancel. */
|
|
339
|
+
async cancelLargeFile(config) {
|
|
340
|
+
let info = largeUploadInfo.get(config.uploadId);
|
|
405
341
|
if (!info)
|
|
406
342
|
return;
|
|
407
|
-
largeUploadInfo.delete(uploadId);
|
|
408
|
-
let bucket = await
|
|
343
|
+
largeUploadInfo.delete(config.uploadId);
|
|
344
|
+
let bucket = await (0, storageServerState_1.getLoadedBucket)(info.account, info.bucketName);
|
|
409
345
|
if (!bucket)
|
|
410
346
|
return;
|
|
411
|
-
|
|
347
|
+
const routeKey = info.routeKey;
|
|
348
|
+
let target = bucket.stores.find(x => x.routeKey === routeKey);
|
|
349
|
+
if (!target)
|
|
350
|
+
return;
|
|
351
|
+
await target.store.cancelLargeUpload({ id: config.uploadId });
|
|
412
352
|
}
|
|
413
353
|
// IMPORTANT: We can never expose enumeration (listing, prefix search, changes feeds) over this public HTTP endpoint - only exact-key reads. Enumeration would be a massive security risk (public buckets rely on unguessable keys staying unguessable), and could also crash the client by sending them too much data. Listings exist only on the authenticated API (findInfo etc, behind accountAccess).
|
|
414
354
|
async httpEntry(config) {
|
|
@@ -431,9 +371,9 @@ class RemoteStorageControllerBase {
|
|
|
431
371
|
if (!account || !bucketName || !filePath) {
|
|
432
372
|
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(""), { status: "404" });
|
|
433
373
|
}
|
|
434
|
-
assertValidName(account, "account");
|
|
435
|
-
assertValidName(bucketName, "bucket name");
|
|
436
|
-
assertValidPath(filePath);
|
|
374
|
+
(0, validation_1.assertValidName)(account, "account");
|
|
375
|
+
(0, validation_1.assertValidName)(bucketName, "bucket name");
|
|
376
|
+
(0, validation_1.assertValidPath)(filePath);
|
|
437
377
|
let bucket = await (0, storageServerState_1.getLoadedBucket)(account, bucketName);
|
|
438
378
|
if (!bucket) {
|
|
439
379
|
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(""), { status: "404" });
|
|
@@ -441,7 +381,17 @@ class RemoteStorageControllerBase {
|
|
|
441
381
|
if (!((_a = bucket.self) === null || _a === void 0 ? void 0 : _a.public)) {
|
|
442
382
|
throw new Error(`Bucket ${account}/${bucketName} is not public, so its files cannot be read over plain URLs`);
|
|
443
383
|
}
|
|
444
|
-
|
|
384
|
+
// Anonymous URL reads carry no source selection - the file's route picks the store, and a route no store here covers is simply not found (the routing file itself lives outside every store)
|
|
385
|
+
let httpStore;
|
|
386
|
+
let info;
|
|
387
|
+
if (filePath !== remoteConfig_1.ROUTING_FILE) {
|
|
388
|
+
let route = (0, remoteConfig_1.getRoute)(filePath);
|
|
389
|
+
httpStore = bucket.stores.find(s => (0, remoteConfig_1.routeContains)(s.route, route));
|
|
390
|
+
info = httpStore && await httpStore.store.getInfo({ path: filePath }) || undefined;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
info = await (0, bucketDisk_1.getRoutingFileResult)(account, bucketName);
|
|
394
|
+
}
|
|
445
395
|
if (!info || !info.size) {
|
|
446
396
|
(0, accessStats_1.trackAccess)({ account, operation: "httpGet", path: `${bucketName}/${filePath}`, size: 0 });
|
|
447
397
|
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(""), { status: "404" });
|
|
@@ -484,7 +434,16 @@ class RemoteStorageControllerBase {
|
|
|
484
434
|
range = { start, end: endInclusive + 1 };
|
|
485
435
|
}
|
|
486
436
|
}
|
|
487
|
-
let result
|
|
437
|
+
let result;
|
|
438
|
+
if (httpStore) {
|
|
439
|
+
result = await httpStore.store.get2({ path: filePath, range });
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
result = await (0, bucketDisk_1.getRoutingFileResult)(account, bucketName);
|
|
443
|
+
if (result && range) {
|
|
444
|
+
result = { ...result, data: result.data.subarray(Math.min(range.start, result.data.length), Math.min(range.end, result.data.length)) };
|
|
445
|
+
}
|
|
446
|
+
}
|
|
488
447
|
(0, accessStats_1.trackAccess)({ account, operation: "httpGet", path: `${bucketName}/${filePath}`, size: result && result.data.length || 0 });
|
|
489
448
|
if (!result) {
|
|
490
449
|
return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(""), { status: "404" });
|
|
@@ -495,17 +454,92 @@ class RemoteStorageControllerBase {
|
|
|
495
454
|
return (0, callHTTPHandler_1.setHTTPResultHeaders)(result.data, headers);
|
|
496
455
|
}
|
|
497
456
|
}
|
|
457
|
+
__decorate([
|
|
458
|
+
validation_1.assertValidArgs
|
|
459
|
+
], RemoteStorageControllerBase.prototype, "requestAccess", null);
|
|
460
|
+
__decorate([
|
|
461
|
+
validation_1.assertValidArgs
|
|
462
|
+
], RemoteStorageControllerBase.prototype, "getAccessState", null);
|
|
463
|
+
__decorate([
|
|
464
|
+
validation_1.assertValidArgs,
|
|
465
|
+
(0, accessStats_1.trackAccessCall)("get")
|
|
466
|
+
], RemoteStorageControllerBase.prototype, "get2", null);
|
|
467
|
+
__decorate([
|
|
468
|
+
validation_1.assertValidArgs,
|
|
469
|
+
(0, accessStats_1.trackAccessCall)("set")
|
|
470
|
+
], RemoteStorageControllerBase.prototype, "set", null);
|
|
471
|
+
__decorate([
|
|
472
|
+
validation_1.assertValidArgs,
|
|
473
|
+
(0, accessStats_1.trackAccessCall)("del")
|
|
474
|
+
], RemoteStorageControllerBase.prototype, "del", null);
|
|
475
|
+
__decorate([
|
|
476
|
+
validation_1.assertValidArgs,
|
|
477
|
+
(0, accessStats_1.trackAccessCall)("getInfo")
|
|
478
|
+
], RemoteStorageControllerBase.prototype, "getInfo", null);
|
|
479
|
+
__decorate([
|
|
480
|
+
validation_1.assertValidArgs,
|
|
481
|
+
(0, accessStats_1.trackAccessCall)("findInfo")
|
|
482
|
+
], RemoteStorageControllerBase.prototype, "findInfo", null);
|
|
483
|
+
__decorate([
|
|
484
|
+
validation_1.assertValidArgs,
|
|
485
|
+
(0, accessStats_1.trackAccessCall)("getChangesAfter")
|
|
486
|
+
], RemoteStorageControllerBase.prototype, "getChangesAfter2", null);
|
|
487
|
+
__decorate([
|
|
488
|
+
validation_1.assertValidArgs
|
|
489
|
+
], RemoteStorageControllerBase.prototype, "getArchivesConfig", null);
|
|
490
|
+
__decorate([
|
|
491
|
+
validation_1.assertValidArgs
|
|
492
|
+
], RemoteStorageControllerBase.prototype, "listBuckets", null);
|
|
493
|
+
__decorate([
|
|
494
|
+
validation_1.assertValidArgs
|
|
495
|
+
], RemoteStorageControllerBase.prototype, "getActiveBucket", null);
|
|
496
|
+
__decorate([
|
|
497
|
+
validation_1.assertValidArgs
|
|
498
|
+
], RemoteStorageControllerBase.prototype, "activateBucket", null);
|
|
499
|
+
__decorate([
|
|
500
|
+
validation_1.assertValidArgs
|
|
501
|
+
], RemoteStorageControllerBase.prototype, "clearWriteStats", null);
|
|
502
|
+
__decorate([
|
|
503
|
+
validation_1.assertValidArgs
|
|
504
|
+
], RemoteStorageControllerBase.prototype, "getAccessStats", null);
|
|
505
|
+
__decorate([
|
|
506
|
+
validation_1.assertValidArgs
|
|
507
|
+
], RemoteStorageControllerBase.prototype, "getAccessSummaries", null);
|
|
508
|
+
__decorate([
|
|
509
|
+
validation_1.assertValidArgs
|
|
510
|
+
], RemoteStorageControllerBase.prototype, "getIndexInfo", null);
|
|
511
|
+
__decorate([
|
|
512
|
+
validation_1.assertValidArgs
|
|
513
|
+
], RemoteStorageControllerBase.prototype, "getSyncStatus", null);
|
|
514
|
+
__decorate([
|
|
515
|
+
validation_1.assertValidArgs
|
|
516
|
+
], RemoteStorageControllerBase.prototype, "startLargeFile", null);
|
|
517
|
+
/** The one resolution every data call does: the client's selected sourceConfig maps to exactly one store (loading the bucket - and so instantiating its stores - if needed), and fn runs on it. findBucketStore throws for missing buckets and unmatched configs. */
|
|
518
|
+
async function withStore(config, fn) {
|
|
519
|
+
let target = await (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
|
|
520
|
+
return await fn(target.store);
|
|
521
|
+
}
|
|
498
522
|
const largeUploadInfo = new Map();
|
|
523
|
+
async function findUploadStore(info) {
|
|
524
|
+
let bucket = await (0, storageServerState_1.requireBucket)(info.account, info.bucketName);
|
|
525
|
+
let target = bucket.stores.find(x => x.routeKey === info.routeKey);
|
|
526
|
+
if (!target) {
|
|
527
|
+
throw new Error(`The store (route ${info.routeKey}) this upload targets no longer exists on bucket ${info.account}/${info.bucketName} (available: ${JSON.stringify(bucket.stores.map(x => x.routeKey))})`);
|
|
528
|
+
}
|
|
529
|
+
return target;
|
|
530
|
+
}
|
|
499
531
|
const accountAccess = async (context) => {
|
|
500
532
|
let start = Date.now();
|
|
501
|
-
|
|
533
|
+
let config = context.call.args[0];
|
|
534
|
+
await requireAccess(String(config === null || config === void 0 ? void 0 : config.account));
|
|
502
535
|
let duration = Date.now() - start;
|
|
503
536
|
if (duration > ACCESS_CHECK_SLOW_TIME) {
|
|
504
537
|
console.log(`Access check for ${context.call.functionName} took ${duration}ms`);
|
|
505
538
|
}
|
|
506
539
|
};
|
|
507
540
|
const uploadAccess = async (context) => {
|
|
508
|
-
let
|
|
541
|
+
let config = context.call.args[0];
|
|
542
|
+
let info = largeUploadInfo.get(String(config === null || config === void 0 ? void 0 : config.uploadId));
|
|
509
543
|
if (!info)
|
|
510
544
|
return;
|
|
511
545
|
await requireAccess(info.account);
|
|
@@ -523,7 +557,6 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
|
|
|
523
557
|
adminListRequests: { hooks: [adminAccess] },
|
|
524
558
|
adminListActiveBuckets: { hooks: [adminAccess] },
|
|
525
559
|
adminGrantAccess: { hooks: [adminAccess] },
|
|
526
|
-
get: { hooks: [accountAccess] },
|
|
527
560
|
get2: { hooks: [accountAccess] },
|
|
528
561
|
set: { hooks: [accountAccess] },
|
|
529
562
|
del: { hooks: [accountAccess] },
|
|
@@ -548,5 +581,5 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
|
|
|
548
581
|
noClientHooks: true,
|
|
549
582
|
noDefaultHooks: true,
|
|
550
583
|
}));
|
|
551
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQTZIO0FBQzdILGlEQUE4QztBQUM5Qyw2REFLOEI7QUFDOUIsdUVBQW9FO0FBQ3BFLCtDQUE2STtBQUdoSSxRQUFBLHlCQUF5QixHQUFHLGtDQUFrQyxDQUFDO0FBQy9ELFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsUUFBQSx5QkFBeUIsR0FBRywyQ0FBMkMsQ0FBQztBQUN4RSxRQUFBLHFCQUFxQixHQUFHLHVDQUF1QyxDQUFDO0FBRTdFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQVksR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQWlDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7QUFFM0Msd1pBQXdaO0FBQ3haLE1BQU0sYUFBYSxHQUE4QjtJQUM3QyxHQUFHLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLGlDQUFpQztJQUN2RSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVc7SUFDM0csSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZO0lBQ3hELEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxH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XCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uSG9vayB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgZ2V0Tm9kZUlkSVAgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IHNldEhUVFBSZXN1bHRIZWFkZXJzLCBnZXRDdXJyZW50SFRUUFJlcXVlc3QgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWxsSFRUUEhhbmRsZXJcIjtcbmltcG9ydCB7IHBlcmZvcm1Mb2NhbENhbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWxsTWFuYWdlclwiO1xuaW1wb3J0IHsgUmVxdWlyZUNvbnRyb2xsZXIgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGdldENvbW1vbk5hbWUsIGdldFB1YmxpY0lkZW50aWZpZXIsIGdldE93bk1hY2hpbmVJZCwgdmVyaWZ5LCB2ZXJpZnlNYWNoaW5lSWRGb3JQdWJsaWNLZXkgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIElNTVVUQUJMRV9DQUNIRV9USU1FIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGdldFRydXN0LCBnZXRSZXF1ZXN0cywgZ2V0TG9hZGVkQnVja2V0LCB3cml0ZUJ1Y2tldEZpbGUsXG4gICAgZGVsZXRlQnVja2V0RmlsZSwgYXNzZXJ0V3JpdGVzQWxsb3dlZCwgYXNzZXJ0TXV0YWJsZSwgTG9hZGVkQnVja2V0LFxuICAgIGdldEJ1Y2tldENvbmZpZywgbGlzdEFjY291bnRCdWNrZXRzLCBTZXJ2ZXJCdWNrZXRJbmZvLCBjbGVhckFjY291bnRXcml0ZVN0YXRzLFxuICAgIGdldEFjdGl2ZUJ1Y2tldCwgYWN0aXZhdGVCdWNrZXQsIEFjdGl2ZUJ1Y2tldEluZm8sIGdldEFjdGl2ZUJ1Y2tldEtleXMsXG59IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ2xpZW50Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgdHJhY2tBY2Nlc3MsIGdldEFjY2Vzc1RvdGFscywgcmVhZEFjY2Vzc1N1bW1hcmllcywgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMsIEFjY2Vzc1RvdGFscywgQWNjZXNzU3VtbWFyeVN0YXRlIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB0eXBlIHsgU3VtbWFyeUVudHJ5IH0gZnJvbSBcIi4uLy4uL3RyZWVTdW1tYXJ5XCI7XG5cbmV4cG9ydCBjb25zdCBSRU1PVEVfU1RPUkFHRV9DTEFTU19HVUlEID0gXCJSZW1vdGVTdG9yYWdlQ29udHJvbGxlci1iN2U0MmE5MVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQVVUSF9QVVJQT1NFID0gXCJyZW1vdGVTdG9yYWdlLWF1dGgtMVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQgPSBcIlJFTU9URV9TVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEX2NmMmY3YjFlXCI7XG5leHBvcnQgY29uc3QgU1RPUkFHRV9BQ0NFU1NfREVOSUVEID0gXCJSRU1PVEVfU1RPUkFHRV9BQ0NFU1NfREVOSUVEXzlkODFhNGMwXCI7XG5cbmNvbnN0IEFVVEhfVElNRV9XSU5ET1cgPSB0aW1lSW5NaW51dGUgKiAxMDtcbmNvbnN0IEFDQ0VTU19DSEVDS19TTE9XX1RJTUUgPSA1MDtcbmNvbnN0IE1BWF9TRVNTSU9OUyA9IDEwMCAqIDEwMDA7XG5jb25zdCBNQVhfUkVRVUVTVFNfUEVSX0lQID0gNTA7XG5cbmV4cG9ydCB0eXBlIEF1dGhUb2tlbkRhdGEgPSB7XG4gICAgcHVycG9zZTogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbiAgICBzZXJ2ZXI6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBBdXRoVG9rZW4gPSB7XG4gICAgY2VydFBlbTogc3RyaW5nO1xuICAgIHNpZ25hdHVyZTogc3RyaW5nO1xuICAgIGRhdGE6IEF1dGhUb2tlbkRhdGE7XG59O1xuZXhwb3J0IHR5cGUgQWNjZXNzUmVxdWVzdCA9IHtcbiAgICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVHJ1c3RSZWNvcmQgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc1N0YXRlID0ge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgaGFzQWNjZXNzOiBib29sZWFuO1xuICAgIGdyYW50QWNjZXNzQ29tbWFuZD86IHN0cmluZztcbiAgICB0cnVzdGVkTWFjaGluZXM/OiBUcnVzdFJlY29yZFtdO1xufTtcblxuY29uc3Qgc2Vzc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vLyBXZSBtdXN0IG5ldmVyIHNlcnZlIGFueXRoaW5nIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCBhcyBjb2RlIChodG1sLCBqcyAtIGFuZCBzdmcsIHdoaWNoIGNhbiBlbWJlZCA8c2NyaXB0PiBhbmQgcnVucyBpdCB3aGVuIHZpc2l0ZWQgYXMgYSBkb2N1bWVudCkuIE90aGVyd2lzZSBhIHVzZXIgY291bGQgaG9zdCBhIGZpbGUgYW5kLCBieSB2aXNpdGluZyBpdCwgcnVuIGl0IG9uIG91ciBkb21haW4gLSBnaXZpbmcgdGhlbSBhY2Nlc3MgdG8gYWxsIG9mIG91ciBrZXlzIGFuZCBjb29raWVzLiBQREYgc3RheXM6IGJyb3dzZXIgUERGIHZpZXdlcnMgcnVuIGFueSBlbWJlZGRlZCBQREYgc2NyaXB0aW5nIGluIGEgc2FuZGJveCB3aXRoIG5vIGFjY2VzcyB0byB0aGUgc2VydmluZyBvcmlnaW4ncyBjb29raWVzIG9yIERPTS5cbmNvbnN0IENPTlRFTlRfVFlQRVM6IHsgW2V4dDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY3NzOiBcInRleHQvY3NzOyBjaGFyc2V0PXV0Zi04XCIsIGpzb246IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIHR4dDogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIsIHBuZzogXCJpbWFnZS9wbmdcIiwganBnOiBcImltYWdlL2pwZWdcIiwganBlZzogXCJpbWFnZS9qcGVnXCIsIGdpZjogXCJpbWFnZS9naWZcIixcbiAgICB3ZWJwOiBcImltYWdlL3dlYnBcIiwgbXA0OiBcInZpZGVvL21wNFwiLCB3ZWJtOiBcInZpZGVvL3dlYm1cIixcbiAgICBtcDM6IFwiYXVkaW8vbXBlZ1wiLCB3YXY6IFwiYXVkaW8vd2F2XCIsIHBkZjogXCJhcHBsaWNhdGlvbi9wZGZcIixcbn07XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkTmFtZSh2YWx1ZTogc3RyaW5nLCBraW5kOiBzdHJpbmcpIHtcbiAgICBpZiAoIS9eW1xcdy1dezEsNjR9JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7a2luZH0gJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9LCBleHBlY3RlZCAxLTY0IGNoYXJhY3RlcnMgb2YgbGV0dGVycy9udW1iZXJzL3VuZGVyc2NvcmUvZGFzaGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoQnVmZmVyLmZyb20ocGF0aCwgXCJ1dGY4XCIpLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRvbyBsb25nOiAke3BhdGgubGVuZ3RofSBjaGFyYWN0ZXJzID4gMTAwMC4gUGF0aDogJHtwYXRoLnNsaWNlKDAsIDIwMCl9YCk7XG4gICAgfVxuICAgIGlmICghcGF0aCB8fCBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpIHx8IHBhdGguZW5kc1dpdGgoXCIvXCIpIHx8IHBhdGguaW5jbHVkZXMoXCIvL1wiKSB8fCBwYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBwYXRoLmluY2x1ZGVzKFwiXFx4MDBcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoLnNsaWNlKDAsIDIwMCkpfSwgcGF0aHMgY2Fubm90IGJlIGVtcHR5LCBzdGFydCBvciBlbmQgd2l0aCAvLCBvciBjb250YWluIC8vLCBiYWNrc2xhc2hlcywgb3IgbnVsbCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5zb21lKHBhcnQgPT4gcGFydCA9PT0gXCIuXCIgfHwgcGFydCA9PT0gXCIuLlwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGguc2xpY2UoMCwgMjAwKSl9LCBwYXRocyBjYW5ub3QgY29udGFpbiAuIG9yIC4uIHNlZ21lbnRzYCk7XG4gICAgfVxufVxuXG5jb25zdCBjb25uZWN0ZWRDbGllbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5mdW5jdGlvbiB0cmFja0NhbGxlcigpOiB2b2lkIHtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgIGlmIChjb25uZWN0ZWRDbGllbnRzLmhhcyhub2RlSWQpKSByZXR1cm47XG4gICAgY29ubmVjdGVkQ2xpZW50cy5hZGQobm9kZUlkKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5vbk5leHREaXNjb25uZWN0KG5vZGVJZCwgKCkgPT4ge1xuICAgICAgICBjb25uZWN0ZWRDbGllbnRzLmRlbGV0ZShub2RlSWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYEJyb2FkY2FzdGluZyByb3V0aW5nIGNvbmZpZyBjaGFuZ2UgdG8gJHtjb25uZWN0ZWRDbGllbnRzLnNpemV9IGNvbm5lY3RlZCBjbGllbnRzYCk7XG4gICAgZm9yIChsZXQgbm9kZUlkIG9mIFsuLi5jb25uZWN0ZWRDbGllbnRzXSkge1xuICAgICAgICB2b2lkIFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW25vZGVJZF0ucm91dGluZ0NvbmZpZ0NoYW5nZWQoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGVyTWFjaGluZUlkKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxlciA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBzZXNzaW9ucy5nZXQoY2FsbGVyLm5vZGVJZCk7XG4gICAgaWYgKCFtYWNoaW5lSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUR9IENhbGwgYXV0aGVudGljYXRlIGZpcnN0IChjb25uZWN0aW9uICR7Y2FsbGVyLm5vZGVJZH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lSWQ7XG59XG5mdW5jdGlvbiBnZXRDYWxsZXJJUCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXROb2RlSWRJUChTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKS5ub2RlSWQpO1xufVxuZnVuY3Rpb24gaXNBZG1pbihtYWNoaW5lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkucm9vdERvbWFpbik7XG59XG5mdW5jdGlvbiByZXF1aXJlQWRtaW4oKTogc3RyaW5nIHtcbiAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgaWYgKCFpc0FkbWluKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gQWRtaW4gY29tbWFuZHMgbXVzdCBiZSBydW4gZnJvbSB0aGUgc3RvcmFnZSBtYWNoaW5lIGl0c2VsZiAoY2FsbGVyIG1hY2hpbmUgJHttYWNoaW5lSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZUFjY2VzcyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmIChpc0FkbWluKG1hY2hpbmVJZCkpIHJldHVybiBtYWNoaW5lSWQ7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgdHJ1c3RlZCA9IGF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICBpZiAoIXRydXN0ZWQpIHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHttYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KGFjY291bnQpfS4gVmlzaXQgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8ke2FjY291bnR9IGZvciBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NvbW1hbmQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB7IHNzaFRhcmdldCwgc2VydmVyQ29tbWFuZCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIHJldHVybiBgc3NoICR7c3NoVGFyZ2V0fSAnJHtzZXJ2ZXJDb21tYW5kfSAtLXJlcXVlc3RJZCAke3JlcXVlc3RJZH0nYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgIGFzc2VydFZhbGlkTmFtZShidWNrZXROYW1lLCBcImJ1Y2tldCBuYW1lXCIpO1xuICAgIHJldHVybiBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmNsYXNzIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSB7XG4gICAgYXN5bmMgcGluZygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHRyYWNrQ2FsbGVyKCk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBhc3luYyBhdXRoZW50aWNhdGUodG9rZW46IEF1dGhUb2tlbik6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9PiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIHZlcmlmeSh0b2tlbi5jZXJ0UGVtLCB0b2tlbi5zaWduYXR1cmUsIHRva2VuLmRhdGEpO1xuICAgICAgICBsZXQgeyBwdXJwb3NlLCB0aW1lLCBzZXJ2ZXIgfSA9IHRva2VuLmRhdGE7XG4gICAgICAgIGlmIChwdXJwb3NlICE9PSBTVE9SQUdFX0FVVEhfUFVSUE9TRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIHB1cnBvc2UgaXMgJHtKU09OLnN0cmluZ2lmeShwdXJwb3NlKX0sIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkoU1RPUkFHRV9BVVRIX1BVUlBPU0UpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNYXRoLmFicyhEYXRlLm5vdygpIC0gdGltZSkgPiBBVVRIX1RJTUVfV0lORE9XKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gdGltZSBpcyB0b28gZmFyIGZyb20gdGhlIHNlcnZlciB0aW1lICh0b2tlbiAke3RpbWV9LCBzZXJ2ZXIgJHtEYXRlLm5vdygpfSwgYWxsb3dlZCBkcmlmdCAke0FVVEhfVElNRV9XSU5ET1d9bXMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRva2VuRG9tYWluID0gc2VydmVyLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgaWYgKHRva2VuRG9tYWluICE9PSBkb21haW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiBpcyBmb3Igc2VydmVyICR7SlNPTi5zdHJpbmdpZnkoc2VydmVyKX0sIGJ1dCB0aGlzIHNlcnZlciBpcyAke0pTT04uc3RyaW5naWZ5KGAke2RvbWFpbn06JHtwb3J0fWApfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBnZXRDb21tb25OYW1lKHRva2VuLmNlcnRQZW0pLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgaWYgKCF2ZXJpZnlNYWNoaW5lSWRGb3JQdWJsaWNLZXkoeyBtYWNoaW5lSWQsIHB1YmxpY0tleTogZ2V0UHVibGljSWRlbnRpZmllcih0b2tlbi5jZXJ0UGVtKSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBjb21tb24gbmFtZSAke0pTT04uc3RyaW5naWZ5KGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkpfSBkb2VzIG5vdCBtYXRjaCBpdHMgcHVibGljIGtleWApO1xuICAgICAgICB9XG4gICAgICAgIHNlc3Npb25zLnNldChjYWxsZXIubm9kZUlkLCBtYWNoaW5lSWQpO1xuICAgICAgICB3aGlsZSAoc2Vzc2lvbnMuc2l6ZSA+IE1BWF9TRVNTSU9OUykge1xuICAgICAgICAgICAgbGV0IG9sZGVzdCA9IHNlc3Npb25zLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgICAgc2Vzc2lvbnMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcDogZ2V0Q2FsbGVySVAoKSB9O1xuICAgIH1cblxuICAgIGFzeW5jIHJlcXVlc3RBY2Nlc3MoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyByZXF1ZXN0SWQ6IHN0cmluZzsgZ3JhbnRBY2Nlc3NDb21tYW5kOiBzdHJpbmcgfT4ge1xuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCByZXF1ZXN0c1N0b3JhZ2UgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCByZXF1ZXN0c1N0b3JhZ2UuZ2V0KGlwKSB8fCBbXTtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVxdWVzdHMuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nID0ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApLFxuICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaChleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJlcXVlc3RzLmxlbmd0aCA+IE1BWF9SRVFVRVNUU19QRVJfSVApIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIGF3YWl0IHJlcXVlc3RzU3RvcmFnZS5zZXQoaXAsIHJlcXVlc3RzKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcCwgcmVxdWVzdElkOiBleGlzdGluZy5yZXF1ZXN0SWQsIGdyYW50QWNjZXNzQ29tbWFuZDogZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKGV4aXN0aW5nLnJlcXVlc3RJZCkgfTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBY2Nlc3NTdGF0ZShhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPEFjY2Vzc1N0YXRlPiB7XG4gICAgICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBnZXRDYWxsZXJNYWNoaW5lSWQoKTtcbiAgICAgICAgbGV0IGlwID0gZ2V0Q2FsbGVySVAoKTtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IGhhc0FjY2VzcyA9IGlzQWRtaW4obWFjaGluZUlkKSB8fCAhIWF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICAgICAgbGV0IHJlc3VsdDogQWNjZXNzU3RhdGUgPSB7IG1hY2hpbmVJZCwgaXAsIGhhc0FjY2VzcyB9O1xuICAgICAgICBpZiAoIWhhc0FjY2Vzcykge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgICAgIGxldCBvd25SZXF1ZXN0ID0gKGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pLmZpbmQoeCA9PiB4LmFjY291bnQgPT09IGFjY291bnQgJiYgeC5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCk7XG4gICAgICAgICAgICBpZiAob3duUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5ncmFudEFjY2Vzc0NvbW1hbmQgPSBnZXRHcmFudEFjY2Vzc0NvbW1hbmQob3duUmVxdWVzdC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cnVzdGVkTWFjaGluZXM6IFRydXN0UmVjb3JkW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgJHthY2NvdW50fXxgKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcmVjb3JkID0gYXdhaXQgdHJ1c3QuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVjb3JkKSB0cnVzdGVkTWFjaGluZXMucHVzaChyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC50cnVzdGVkTWFjaGluZXMgPSB0cnVzdGVkTWFjaGluZXM7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgbGlzdFJlcXVlc3RzRm9ySVAoYWNjb3VudDogc3RyaW5nLCBpcDogc3RyaW5nKTogUHJvbWlzZTxBY2Nlc3NSZXF1ZXN0W10+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKS5maWx0ZXIoeCA9PiB4LmFjY291bnQgPT09IGFjY291bnQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdyYW50QWNjZXNzKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgY2FsbGVyTWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIGZvciAobGV0IGlwIG9mIGF3YWl0IHJlcXVlc3RzLmdldEtleXMoKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVxdWVzdCBvZiBhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdElkICE9PSByZXF1ZXN0SWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghaXNBZG1pbihjYWxsZXJNYWNoaW5lSWQpICYmICFhd2FpdCB0cnVzdC5nZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke2NhbGxlck1hY2hpbmVJZH1gKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9BQ0NFU1NfREVOSUVEfSBNYWNoaW5lICR7Y2FsbGVyTWFjaGluZUlkfSBoYXMgbm8gYWNjZXNzIHRvIGFjY291bnQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmFjY291bnQpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVjb3JkOiBUcnVzdFJlY29yZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudDogcmVxdWVzdC5hY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICBtYWNoaW5lSWQ6IHJlcXVlc3QubWFjaGluZUlkLFxuICAgICAgICAgICAgICAgICAgICBpcDogcmVxdWVzdC5pcCxcbiAgICAgICAgICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHRydXN0LnNldChgJHtyZXF1ZXN0LmFjY291bnR9fCR7cmVxdWVzdC5tYWNoaW5lSWR9YCwgcmVjb3JkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYWNjZXNzIHJlcXVlc3QgZm91bmQgd2l0aCBpZCAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3RJZCl9LiBJdCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZ3JhbnRlZCBvciBleHBpcmVkLmApO1xuICAgIH1cblxuICAgIC8qKiBBZG1pbiAoc28gb25seSB0aGlzIG1hY2hpbmUncyBvd24gcHJvY2Vzc2VzIGNhbiBjYWxsIGl0KTogdGhlIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGhhcyBsb2FkZWQuIEEgZGVwbG95IHN1Y2Nlc3NvciBhc2tzIGl0cyBwcmVkZWNlc3NvciBmb3IgdGhpcywgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgaW4gdXNlIGluc3RlYWQgb2YgZXZlcnkgYnVja2V0IG9uIGRpc2suICovXG4gICAgYXN5bmMgYWRtaW5MaXN0QWN0aXZlQnVja2V0cygpOiBQcm9taXNlPHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfVtdPiB7XG4gICAgICAgIHJldHVybiBnZXRBY3RpdmVCdWNrZXRLZXlzKCk7XG4gICAgfVxuICAgIGFzeW5jIGFkbWluTGlzdFJlcXVlc3RzKGlwOiBzdHJpbmcpOiBQcm9taXNlPEFjY2Vzc1JlcXVlc3RbXT4ge1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXTtcbiAgICB9XG4gICAgYXN5bmMgYWRtaW5HcmFudEFjY2VzcyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8VHJ1c3RSZWNvcmQ+IHtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhdGgsIHJhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzeW5jIGdldDIoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sIGludGVybmFsPzogYm9vbGVhbik6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhc3NlcnRWYWxpZFBhdGgocGF0aCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChidWNrZXQpIHtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbCAmJiBidWNrZXQuc3RvcmUuZ2V0SW50ZXJuYWwyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYnVja2V0LnN0b3JlLmdldEludGVybmFsMihwYXRoLCB7IHJhbmdlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0MihwYXRoLCB7IHJhbmdlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke3BhdGh9YCwgc2l6ZTogcmVzdWx0ICYmIHJlc3VsdC5kYXRhLmxlbmd0aCB8fCAwIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBzZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgZGF0YTogQnVmZmVyLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIsIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbiwgaW50ZXJuYWw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFZhbGlkTmFtZShidWNrZXROYW1lLCBcImJ1Y2tldCBuYW1lXCIpO1xuICAgICAgICBhc3NlcnRWYWxpZFBhdGgocGF0aCk7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0IHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBidWZmZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGluIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwic2V0XCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7cGF0aH1gLCBzaXplOiBkYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhdGgsIEJ1ZmZlci5mcm9tKGRhdGEpLCB7IGxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGUsIGludGVybmFsIH0pO1xuICAgIH1cbiAgICBhc3luYyBkZWwoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgbGFzdE1vZGlmaWVkPzogbnVtYmVyLCBpbnRlcm5hbD86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChwYXRoKTtcbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiZGVsXCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7cGF0aH1gIH0pO1xuICAgICAgICBhd2FpdCBkZWxldGVCdWNrZXRGaWxlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhdGgsIHsgbGFzdE1vZGlmaWVkLCBpbnRlcm5hbCB9KTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0SW5mbyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nLCBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChwYXRoKTtcbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiZ2V0SW5mb1wiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke3BhdGh9YCB9KTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhwYXRoLCB7IGluY2x1ZGVUb21ic3RvbmVzIH0pO1xuICAgIH1cbiAgICBhc3luYyBmaW5kSW5mbyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU/OiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgZ2V0QnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGJ1Y2tldCAmJiBhd2FpdCBidWNrZXQuc3RvcmUuZmluZEluZm8ocHJlZml4LCBjb25maWcpIHx8IFtdO1xuICAgICAgICAvLyBUaGUgcGF0aHMgYXJlIG9ubHkga25vd24gb25jZSB0aGUgcmVzdWx0cyBhcmUgaW47IGFuIGVtcHR5IHJlc3VsdCBzdGlsbCBjb3VudHMgYXMgb25lIGFjY2VzcyBhdCB0aGUgcHJlZml4LlxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZm8gb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImZpbmRJbmZvXCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7aW5mby5wYXRofWAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbjogXCJmaW5kSW5mb1wiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke3ByZWZpeH1gIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyMihjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpbmZvIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImdldENoYW5nZXNBZnRlclwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2luZm8ucGF0aH1gIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBhc3luYyBnZXRBcmNoaXZlc0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBUaGUgYWNjZXNzIGhvb2sgKGFuZCB0aGUgc3RvcmFnZSBpdCBpbml0aWFsaXplcykgcnVucyBiZWZvcmUgdGhpcywgc28gYSBsYXJnZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgY2FsbGVyJ3MgdGltaW5nIGlzIHRoZSBob29rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEJ1Y2tldHMoJHthY2NvdW50fSkgY2FsbCBib2R5IHRvb2sgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogVGhlIGxpdmUsIGluLW1lbW9yeSBzdGF0ZSBvZiBvbmUgYnVja2V0LCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBBbnN3ZXJlZCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkaXNrLCBzbyBpdCBpcyBjaGVhcCAtIGJ1dCBvbmx5IHdvcmtzIHdoaWxlIHRoZSBidWNrZXQgaXMgbG9hZGVkIGhlcmUuICovXG4gICAgYXN5bmMgZ2V0QWN0aXZlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgICAgIGFzc2VydFZhbGlkTmFtZShidWNrZXROYW1lLCBcImJ1Y2tldCBuYW1lXCIpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0QWN0aXZlQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogTG9hZHMgYSBidWNrZXQgdGhhdCBleGlzdHMgb24gdGhpcyBzZXJ2ZXIgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICovXG4gICAgYXN5bmMgYWN0aXZhdGVCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICB9XG4gICAgLyoqIFplcm9lcyB0aGUgd3JpdGUgc3RhdGlzdGljcyBsaXN0QnVja2V0cyByZXBvcnRzIGFuZCB0aGUgaW4tbWVtb3J5IGFjY2VzcyBzdGF0aXN0aWNzLCBmb3IgZXZlcnkgYnVja2V0IGluIHRoZSBhY2NvdW50LiAqL1xuICAgIGFzeW5jIGNsZWFyV3JpdGVTdGF0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgICAgIGNsZWFyQWNjb3VudEFjY2Vzc1N0YXRzKGFjY291bnQpO1xuICAgICAgICByZXR1cm4geyBjbGVhcmVkQnVja2V0czogY2xlYXJBY2NvdW50V3JpdGVTdGF0cyhhY2NvdW50KSB9O1xuICAgIH1cbiAgICAvKiogSW4tbWVtb3J5IHRvdGFscyBwZXIgb3BlcmF0aW9uIHR5cGUgc2luY2Ugc3RhcnR1cCAob3IgdGhlIGxhc3QgY2xlYXJXcml0ZVN0YXRzKS4gKi9cbiAgICBhc3luYyBnZXRBY2Nlc3NTdGF0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPEFjY2Vzc1RvdGFscz4ge1xuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgICAgICByZXR1cm4gZ2V0QWNjZXNzVG90YWxzKGFjY291bnQpO1xuICAgIH1cbiAgICAvKiogQSBwYXRoIGJyZWFrZG93biBvZiBvbmUgb3BlcmF0aW9uJ3MgYWNjZXNzZXMgKG9wZXJhdGlvbiBuYW1lcyBjb21lIGZyb20gZ2V0QWNjZXNzU3RhdHMpLiBtYXhDb3VudCBpcyBwYXNzZWQgc3RyYWlnaHQgdG8gVHJlZVN1bW1hcnkuZ2V0U3VtbWFyaWVzLiB3ZWlnaHRCeVNpemUgaXMgaWdub3JlZCBmb3IgY291bnQtb25seSBvcGVyYXRpb25zLCB3aGljaCByZXR1cm4gdGhlaXIgY291bnQgYnJlYWtkb3duLiAqL1xuICAgIGFzeW5jIGdldEFjY2Vzc1N1bW1hcmllcyhhY2NvdW50OiBzdHJpbmcsIGNvbmZpZzogeyBvcGVyYXRpb246IHN0cmluZzsgbWF4Q291bnQ6IG51bWJlcjsgd2VpZ2h0QnlTaXplPzogYm9vbGVhbiB9KTogUHJvbWlzZTxTdW1tYXJ5RW50cnk8QWNjZXNzU3VtbWFyeVN0YXRlPltdPiB7XG4gICAgICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgICAgIHJldHVybiByZWFkQWNjZXNzU3VtbWFyaWVzKHsgYWNjb3VudCwgLi4uY29uZmlnIH0pO1xuICAgIH1cbiAgICBhc3luYyBnZXRJbmRleEluZm8oYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQgfHwgIWJ1Y2tldC5zdG9yZS5jb21wdXRlSW5kZXhUb3RhbHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuY29tcHV0ZUluZGV4VG90YWxzKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldFN5bmNTdGF0dXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgZ2V0QnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHsgYWxsU2NhbnNDb21wbGV0ZTogdHJ1ZSwgaW5kZXhTaXplOiAwLCBzb3VyY2VzOiBbXSB9O1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBzeW5jaHJvbml6YXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnRMYXJnZUZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgbGFzdE1vZGlmaWVkPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBhc3NlcnRWYWxpZFBhdGgocGF0aCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBhc3NlcnRNdXRhYmxlKGJ1Y2tldCwgcGF0aCwgbGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCBidWNrZXQuc3RvcmUuc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uc2V0KGlkLCB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHBhdGgsIGxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBhc3luYyB1cGxvYWRQYXJ0KHVwbG9hZElkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBpbmZvID0gbGFyZ2VVcGxvYWRJbmZvLmdldCh1cGxvYWRJZCk7XG4gICAgICAgIGlmICghaW5mbykgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhcmdlIHVwbG9hZCAke3VwbG9hZElkfWApO1xuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQ6IGluZm8uYWNjb3VudCwgb3BlcmF0aW9uOiBcInVwbG9hZFBhcnRcIiwgcGF0aDogYCR7aW5mby5idWNrZXROYW1lfS8ke2luZm8ucGF0aH1gLCBzaXplOiBkYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldEJ1Y2tldChpbmZvLmFjY291bnQsIGluZm8uYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0KSB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2luZm8uYWNjb3VudH0vJHtpbmZvLmJ1Y2tldE5hbWV9IG5vIGxvbmdlciBleGlzdHNgKTtcbiAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKHVwbG9hZElkLCBCdWZmZXIuZnJvbShkYXRhKSk7XG4gICAgfVxuICAgIGFzeW5jIGZpbmlzaExhcmdlRmlsZSh1cGxvYWRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGluZm8gPSBsYXJnZVVwbG9hZEluZm8uZ2V0KHVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7dXBsb2FkSWR9YCk7XG4gICAgICAgIGxhcmdlVXBsb2FkSW5mby5kZWxldGUodXBsb2FkSWQpO1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgZ2V0QnVja2V0KGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7aW5mby5hY2NvdW50fS8ke2luZm8uYnVja2V0TmFtZX0gbm8gbG9uZ2VyIGV4aXN0c2ApO1xuICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQodXBsb2FkSWQsIGluZm8ucGF0aCwgaW5mby5sYXN0TW9kaWZpZWQpO1xuICAgIH1cbiAgICBhc3luYyBjYW5jZWxMYXJnZUZpbGUodXBsb2FkSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQodXBsb2FkSWQpO1xuICAgICAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLmRlbGV0ZSh1cGxvYWRJZCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRCdWNrZXQoaW5mby5hY2NvdW50LCBpbmZvLmJ1Y2tldE5hbWUpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQodXBsb2FkSWQpO1xuICAgIH1cblxuICAgIC8vIElNUE9SVEFOVDogV2UgY2FuIG5ldmVyIGV4cG9zZSBlbnVtZXJhdGlvbiAobGlzdGluZywgcHJlZml4IHNlYXJjaCwgY2hhbmdlcyBmZWVkcykgb3ZlciB0aGlzIHB1YmxpYyBIVFRQIGVuZHBvaW50IC0gb25seSBleGFjdC1rZXkgcmVhZHMuIEVudW1lcmF0aW9uIHdvdWxkIGJlIGEgbWFzc2l2ZSBzZWN1cml0eSByaXNrIChwdWJsaWMgYnVja2V0cyByZWx5IG9uIHVuZ3Vlc3NhYmxlIGtleXMgc3RheWluZyB1bmd1ZXNzYWJsZSksIGFuZCBjb3VsZCBhbHNvIGNyYXNoIHRoZSBjbGllbnQgYnkgc2VuZGluZyB0aGVtIHRvbyBtdWNoIGRhdGEuIExpc3RpbmdzIGV4aXN0IG9ubHkgb24gdGhlIGF1dGhlbnRpY2F0ZWQgQVBJIChmaW5kSW5mbyBldGMsIGJlaGluZCBhY2NvdW50QWNjZXNzKS5cbiAgICBhc3luYyBodHRwRW50cnkoY29uZmlnPzogeyByZXF1aXJlQ2FsbHM/OiBzdHJpbmdbXTsgY2FjaGVUaW1lPzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBwYXRobmFtZSA9IG5ldyBVUkwocmVxdWVzdD8udXJsIHx8IFwiL1wiLCBcImh0dHBzOi8vbG9jYWxob3N0XCIpLnBhdGhuYW1lO1xuICAgICAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvZmlsZS9cIikpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgcGVyZm9ybUxvY2FsQ2FsbCh7XG4gICAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgICAgIGNhbGw6IHsgbm9kZUlkOiBjYWxsZXIubm9kZUlkLCBjbGFzc0d1aWQ6IFJlcXVpcmVDb250cm9sbGVyLl9jbGFzc0d1aWQsIGZ1bmN0aW9uTmFtZTogXCJyZXF1aXJlSFRNTFwiLCBhcmdzOiBbY29uZmlnXSB9LFxuICAgICAgICAgICAgfSkgYXMgQnVmZmVyO1xuICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzIHRoZSBhY2Nlc3MgcGFnZSBpcyBzZXJ2ZWQgd2l0aCBubyBjb250ZW50IHR5cGUsIGFuZCBhIGJyb3dzZXIgdGhhdCBpcyB0b2xkIG5vdCB0byBzbmlmZiBzaW1wbHkgd2lsbCBub3QgcmVuZGVyIGl0XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoaHRtbCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IGFjY291bnQgPSBwYXJ0c1sxXTtcbiAgICAgICAgbGV0IGJ1Y2tldE5hbWUgPSBwYXJ0c1syXTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gcGFydHMuc2xpY2UoMykuam9pbihcIi9cIik7XG4gICAgICAgIGlmICghYWNjb3VudCB8fCAhYnVja2V0TmFtZSB8fCAhZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGFjY291bnQsIFwiYWNjb3VudFwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgc3RhdHVzOiBcIjQwNFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVja2V0LnNlbGY/LnB1YmxpYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGlzIG5vdCBwdWJsaWMsIHNvIGl0cyBmaWxlcyBjYW5ub3QgYmUgcmVhZCBvdmVyIHBsYWluIFVSTHNgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKCFpbmZvIHx8ICFpbmZvLnNpemUpIHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImh0dHBHZXRcIiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtmaWxlUGF0aH1gLCBzaXplOiAwIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ID0gZmlsZVBhdGguc3BsaXQoXCIuXCIpLnBvcCgpIHx8IFwiXCI7XG4gICAgICAgIGxldCBoZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogQ09OVEVOVF9UWVBFU1tleHQudG9Mb3dlckNhc2UoKV0gfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgICAgIFwiTGFzdC1Nb2RpZmllZFwiOiBuZXcgRGF0ZShpbmZvLndyaXRlVGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChidWNrZXQuc2VsZj8uaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7SU1NVVRBQkxFX0NBQ0hFX1RJTUUgLyAxMDAwfWA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlmTW9kaWZpZWRTaW5jZSA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZk1vZGlmaWVkU2luY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBzaW5jZSA9IG5ldyBEYXRlKGlmTW9kaWZpZWRTaW5jZSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKHNpbmNlICYmIE1hdGguZmxvb3IoaW5mby53cml0ZVRpbWUgLyAxMDAwKSAqIDEwMDAgPD0gc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgLi4uaGVhZGVycywgc3RhdHVzOiBcIjMwNFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0Py5oZWFkZXJzW1wicmFuZ2VcIl07XG4gICAgICAgIGlmICh0eXBlb2YgcmFuZ2VIZWFkZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eYnl0ZXM9KFxcZCopLShcXGQqKSQvLmV4ZWMocmFuZ2VIZWFkZXIudHJpbSgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hbMV0gfHwgbWF0Y2hbMl0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgbGV0IGVuZEluY2x1c2l2ZSA9IGluZm8uc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIGluZm8uc2l6ZSAtICttYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSArbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5jbHVzaXZlID0gTWF0aC5taW4oK21hdGNoWzJdLCBpbmZvLnNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gaW5mby5zaXplIHx8IHN0YXJ0ID4gZW5kSW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICovJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjQxNlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYW5nZSA9IHsgc3RhcnQsIGVuZDogZW5kSW5jbHVzaXZlICsgMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0MihmaWxlUGF0aCwgeyByYW5nZSB9KTtcbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiaHR0cEdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2ZpbGVQYXRofWAsIHNpemU6IHJlc3VsdCAmJiByZXN1bHQuZGF0YS5sZW5ndGggfHwgMCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIHsgLi4uaGVhZGVycywgXCJDb250ZW50LVJhbmdlXCI6IGBieXRlcyAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9LyR7aW5mby5zaXplfWAsIHN0YXR1czogXCIyMDZcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIGhlYWRlcnMpO1xuICAgIH1cbn1cblxuY29uc3QgbGFyZ2VVcGxvYWRJbmZvID0gbmV3IE1hcDxzdHJpbmcsIHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0+KCk7XG5cbmNvbnN0IGFjY291bnRBY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKFN0cmluZyhjb250ZXh0LmNhbGwuYXJnc1swXSkpO1xuICAgIGxldCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgICBpZiAoZHVyYXRpb24gPiBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBY2Nlc3MgY2hlY2sgZm9yICR7Y29udGV4dC5jYWxsLmZ1bmN0aW9uTmFtZX0gdG9vayAke2R1cmF0aW9ufW1zYCk7XG4gICAgfVxufTtcbmNvbnN0IHVwbG9hZEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoU3RyaW5nKGNvbnRleHQuY2FsbC5hcmdzWzBdKSk7XG4gICAgaWYgKCFpbmZvKSByZXR1cm47XG4gICAgYXdhaXQgcmVxdWlyZUFjY2VzcyhpbmZvLmFjY291bnQpO1xufTtcbmNvbnN0IGFkbWluQWNjZXNzOiBTb2NrZXRGdW5jdGlvbkhvb2sgPSBhc3luYyAoKSA9PiB7XG4gICAgcmVxdWlyZUFkbWluKCk7XG59O1xuXG5leHBvcnQgY29uc3QgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIgPSBTb2NrZXRGdW5jdGlvbi5yZWdpc3RlcihcbiAgICBSRU1PVEVfU1RPUkFHRV9DTEFTU19HVUlELFxuICAgIG5ldyBSZW1vdGVTdG9yYWdlQ29udHJvbGxlckJhc2UoKSxcbiAgICAoKSA9PiAoe1xuICAgICAgICBwaW5nOiB7fSxcbiAgICAgICAgYXV0aGVudGljYXRlOiB7fSxcbiAgICAgICAgcmVxdWVzdEFjY2Vzczoge30sXG4gICAgICAgIGdldEFjY2Vzc1N0YXRlOiB7fSxcbiAgICAgICAgbGlzdFJlcXVlc3RzRm9ySVA6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBncmFudEFjY2Vzczoge30sXG4gICAgICAgIGFkbWluTGlzdFJlcXVlc3RzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGFkbWluTGlzdEFjdGl2ZUJ1Y2tldHM6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgYWRtaW5HcmFudEFjY2VzczogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBnZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXQyOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgc2V0OiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZGVsOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5mbzogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGZpbmRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0Q2hhbmdlc0FmdGVyMjogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFyY2hpdmVzQ29uZmlnOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5kZXhJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgbGlzdEJ1Y2tldHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY3RpdmVCdWNrZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBhY3RpdmF0ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGNsZWFyV3JpdGVTdGF0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjY2Vzc1N0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3VtbWFyaWVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0U3luY1N0YXR1czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgdXBsb2FkUGFydDogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgZmluaXNoTGFyZ2VGaWxlOiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBjYW5jZWxMYXJnZUZpbGU6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGh0dHBFbnRyeToge30sXG4gICAgfSksXG4gICAgKCkgPT4gKHtcbiAgICAgICAgbm9DbGllbnRIb29rczogdHJ1ZSxcbiAgICAgICAgbm9EZWZhdWx0SG9va3M6IHRydWUsXG4gICAgfSlcbik7XG4iXX0=
|
|
552
|
-
/* _JS_SOURCE_HASH = "
|
|
584
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQW1JO0FBQ25JLGlEQUF1RTtBQUN2RSw2REFLOEI7QUFDOUIsaURBQW9HO0FBRXBHLDZDQUFvRDtBQUNwRCx1RUFBb0U7QUFDcEUsK0NBQThKO0FBQzlKLDZDQUFpRjtBQUdwRSxRQUFBLHlCQUF5QixHQUFHLGtDQUFrQyxDQUFDO0FBQy9ELFFBQUEsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsUUFBQSx5QkFBeUIsR0FBRywyQ0FBMkMsQ0FBQztBQUN4RSxRQUFBLHFCQUFxQixHQUFHLHVDQUF1QyxDQUFDO0FBRTdFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQVksR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQWlDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7QUFFM0Msd1pBQXdaO0FBQ3haLE1BQU0sYUFBYSxHQUE4QjtJQUM3QyxHQUFHLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLGlDQUFpQztJQUN2RSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVc7SUFDM0csSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZO0lBQ3hELEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsaUJBQWlCO0NBQzlELENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDM0MsU0FBUyxXQUFXO0lBQ2hCLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQy9DLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU87SUFDekMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLCtCQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUN6QyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsU0FBZ0IsdUJBQXVCO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQztJQUNoRyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsS0FBSyxpREFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztBQUNMLENBQUM7QUFMRCwwREFLQztBQUVELFNBQVMsa0JBQWtCO0lBQ3ZCLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGlDQUF5Qix3Q0FBd0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxTQUFTLFdBQVc7SUFDaEIsT0FBTyxJQUFBLHVCQUFXLEVBQUMsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxPQUFPLENBQUMsU0FBaUI7SUFDOUIsT0FBTyxTQUFTLEtBQUssSUFBQSx1QkFBZSxFQUFDLElBQUEscUNBQXNCLEdBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBQ0QsU0FBUyxZQUFZO0lBQ2pCLElBQUksU0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyw2QkFBcUIsK0VBQStFLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDekksQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQWU7SUFDeEMsSUFBQSw0QkFBZSxFQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7SUFDN0IsSUFBSSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ1gsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDZCQUFxQixZQUFZLFNBQVMsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1CQUFtQixNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sMkJBQTJCLENBQUMsQ0FBQztJQUM5TCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsU0FBaUI7SUFDNUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7SUFDNUQsT0FBTyxPQUFPLFNBQVMsS0FBSyxhQUFhLGdCQUFnQixTQUFTLEdBQUcsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSwyQkFBMkI7SUFDN0IsS0FBSyxDQUFDLElBQUk7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBZ0I7UUFDL0IsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLHFDQUFzQixHQUFFLENBQUM7UUFDaEQsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxJQUFBLGNBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssNEJBQW9CLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxTQUFTLENBQUMsNEJBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUgsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxJQUFJLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO1FBQ2xKLENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JJLENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFBLHFCQUFhLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsSUFBQSxtQ0FBMkIsRUFBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBQSwyQkFBbUIsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDN0YsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFBLHFCQUFhLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDN0gsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxPQUFPLFFBQVEsQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMxQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE1BQU07WUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsYUFBYSxDQUFDLE1BQTJCO1FBQzNDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxTQUFTLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLGVBQWUsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQzFDLElBQUksUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDdEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ0osUUFBUSxHQUFHO2dCQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxPQUFPO2dCQUNQLFNBQVM7Z0JBQ1QsRUFBRTtnQkFDRixJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUNuQixDQUFDO1lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQjtZQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvRCxNQUFNLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQzNILENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBMkI7UUFDNUMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRixJQUFJLE1BQU0sR0FBZ0IsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNiLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7WUFDbkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM5RyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLGVBQWUsR0FBa0IsRUFBRSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDN0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksTUFBTTtnQkFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQXVDO1FBQzNELElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7UUFDbkMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBNkI7UUFDM0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLGVBQWUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztRQUNuQyxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDZCQUFxQixZQUFZLGVBQWUsNkJBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkksQ0FBQztnQkFDRCxJQUFJLE1BQU0sR0FBZ0I7b0JBQ3RCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO29CQUM1QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7aUJBQ25CLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNsSSxDQUFDO0lBRUQsNE9BQTRPO0lBQzVPLEtBQUssQ0FBQyxzQkFBc0I7UUFDeEIsT0FBTyxJQUFBLHdDQUFtQixHQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFzQjtRQUMxQyxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQ25DLE9BQU8sTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUE2QjtRQUNoRCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSx1QkFBUSxHQUFFLENBQUM7UUFDN0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztRQUNuQyxLQUFLLElBQUksRUFBRSxJQUFJLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxJQUFJLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQzlDLElBQUksTUFBTSxHQUFnQjtvQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDbkIsQ0FBQztnQkFDRixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFJSyxBQUFOLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBa0w7UUFDekwsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUMvQiwyTEFBMkw7WUFDM0wsT0FBTyxNQUFNLElBQUEsaUNBQW9CLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sTUFBTSxJQUFBLHVDQUFrQixFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUErSztRQUNyTCxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsOEVBQThFO1FBQzlFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSywyQkFBWSxFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLElBQUEsNENBQXVCLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQW9JO1FBQzFJLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFzSDtRQUNoSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRSxPQUFPLE1BQU0sSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQXdHO1FBQ25ILE9BQU8sTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFzSDtRQUN6SSxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUErQztRQUNuRSxPQUFPLElBQUEsb0NBQWUsRUFBQyxNQUFNLElBQUEsa0NBQWEsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBMkI7UUFDekMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNELE9BQU8sTUFBTSxJQUFBLHVDQUFrQixFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO2dCQUFTLENBQUM7WUFDUCxxSUFBcUk7WUFDckksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLE1BQU0sQ0FBQyxPQUFPLG9CQUFvQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN6RixDQUFDO0lBQ0wsQ0FBQztJQUNELDhMQUE4TDtJQUV4TCxBQUFOLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBK0M7UUFDakUsT0FBTyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0Qsc0tBQXNLO0lBRWhLLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUErQztRQUNoRSxPQUFPLE1BQU0sSUFBQSxtQ0FBYyxFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCw0SEFBNEg7SUFFdEgsQUFBTixLQUFLLENBQUMsZUFBZSxDQUFDLE1BQTJCO1FBQzdDLElBQUEscUNBQXVCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBQSwyQ0FBc0IsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsdUZBQXVGO0lBRWpGLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUEyQjtRQUM1QyxPQUFPLElBQUEsNkJBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELCtPQUErTztJQUV6TyxBQUFOLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUF3RjtRQUM3RyxPQUFPLElBQUEsaUNBQW1CLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVLLEFBQU4sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUErQztRQUM5RCxPQUFPLE1BQU0sSUFBQSxzQ0FBaUIsRUFBQyxNQUFNLElBQUEsa0NBQWEsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBK0M7UUFDL0QsT0FBTyxNQUFNLElBQUEscUNBQWdCLEVBQUMsTUFBTSxJQUFBLGtDQUFhLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQWdIO1FBQ2pJLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNGLElBQUksRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RywyTUFBMk07UUFDM00sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckssT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUEwQztRQUN2RCxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkksSUFBSSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE0QjtRQUM5QyxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUNELDBHQUEwRztJQUMxRyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQTRCO1FBQzlDLElBQUksSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsMFlBQTBZO0lBQzFZLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBd0Q7O1FBQ3BFLElBQUksTUFBTSxHQUFHLCtCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEMsSUFBSSxPQUFPLEdBQUcsSUFBQSx1Q0FBcUIsR0FBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsS0FBSSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksR0FBRyxNQUFNLElBQUEsOEJBQWdCLEVBQUM7Z0JBQzlCLE1BQU07Z0JBQ04sSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLHFDQUFpQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2FBQ3hILENBQVcsQ0FBQztZQUNiLGlJQUFpSTtZQUNqSSxPQUFPLElBQUEsc0NBQW9CLEVBQUMsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFBLDRCQUFlLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUEsNEJBQWUsRUFBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0MsSUFBQSw0QkFBZSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxvQ0FBZSxFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQSxNQUFBLE1BQU0sQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLE9BQU8sSUFBSSxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUNELDZMQUE2TDtRQUM3TCxJQUFJLFNBQWtDLENBQUM7UUFDdkMsSUFBSSxJQUFxRCxDQUFDO1FBQzFELElBQUksUUFBUSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUM1QixJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSw0QkFBYSxFQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLEdBQUcsU0FBUyxJQUFJLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDdkYsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLEdBQUcsTUFBTSxJQUFBLGlDQUFvQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUMsSUFBSSxPQUFPLEdBQWlDO1lBQ3hDLGNBQWMsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksMEJBQTBCO1lBQzlFLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3ZELGVBQWUsRUFBRSxPQUFPO1NBQzNCLENBQUM7UUFDRixJQUFJLE1BQUEsTUFBTSxDQUFDLElBQUksMENBQUUsU0FBUyxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsZ0NBQW9CLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksZUFBZSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQWlELENBQUM7UUFDdEQsSUFBSSxXQUFXLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksS0FBSyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQWEsQ0FBQztnQkFDbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNYLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3pILENBQUM7Z0JBQ0QsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE1BQXFFLENBQUM7UUFDMUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxHQUFHLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekQsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0ksQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25KLENBQUM7UUFDRCxPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0o7QUF0VlM7SUFETCw0QkFBZTtnRUF1QmY7QUFHSztJQURMLDRCQUFlO2lFQXlCZjtBQTZESztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQzt1REFVdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQztzREFTdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLEtBQUssQ0FBQztzREFJdEI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLFNBQVMsQ0FBQzswREFPMUI7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLFVBQVUsQ0FBQzsyREFHM0I7QUFHSztJQUZMLDRCQUFlO0lBQ2YsSUFBQSw2QkFBZSxFQUFDLGlCQUFpQixDQUFDO21FQUdsQztBQUVLO0lBREwsNEJBQWU7b0VBR2Y7QUFFSztJQURMLDRCQUFlOzhEQVNmO0FBR0s7SUFETCw0QkFBZTtrRUFHZjtBQUdLO0lBREwsNEJBQWU7aUVBR2Y7QUFHSztJQURMLDRCQUFlO2tFQUlmO0FBR0s7SUFETCw0QkFBZTtpRUFHZjtBQUdLO0lBREwsNEJBQWU7cUVBR2Y7QUFFSztJQURMLDRCQUFlOytEQUdmO0FBRUs7SUFETCw0QkFBZTtnRUFHZjtBQUdLO0lBREwsNEJBQWU7aUVBUWY7QUFtSUwscVFBQXFRO0FBQ3JRLEtBQUssVUFBVSxTQUFTLENBQUksTUFBMkUsRUFBRSxFQUF1QztJQUM1SSxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQWUsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNGLE9BQU8sTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBMEcsQ0FBQztBQUUxSSxLQUFLLFVBQVUsZUFBZSxDQUFDLElBQStEO0lBQzFGLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxrQ0FBYSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsb0RBQW9ELElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL00sQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBdUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3hELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQXFDLENBQUM7SUFDdEUsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDbEMsSUFBSSxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksU0FBUyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQ3BGLENBQUM7QUFDTCxDQUFDLENBQUM7QUFDRixNQUFNLFlBQVksR0FBdUIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ3ZELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBc0MsQ0FBQztJQUN2RSxJQUFJLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUNGLE1BQU0sV0FBVyxHQUF1QixLQUFLLElBQUksRUFBRTtJQUMvQyxZQUFZLEVBQUUsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFVyxRQUFBLHVCQUF1QixHQUFHLCtCQUFjLENBQUMsUUFBUSxDQUMxRCxpQ0FBeUIsRUFDekIsSUFBSSwyQkFBMkIsRUFBRSxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxFQUFFLEVBQUU7SUFDUixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsRUFBRTtJQUNqQixjQUFjLEVBQUUsRUFBRTtJQUNsQixpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzdDLFdBQVcsRUFBRSxFQUFFO0lBQ2YsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtJQUMzQyxzQkFBc0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQ2hELGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDMUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDaEMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDL0IsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDL0IsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDbkMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDcEMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUM1QyxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzdDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3hDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3ZDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzNDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzNDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzFDLGtCQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDOUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDekMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDMUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDckMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDMUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDMUMsU0FBUyxFQUFFLEVBQUU7Q0FDaEIsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDSCxhQUFhLEVBQUUsSUFBSTtJQUNuQixjQUFjLEVBQUUsSUFBSTtDQUN2QixDQUFDLENBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb25Ib29rIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBnZXROb2RlSWRJUCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25vZGVDYWNoZVwiO1xuaW1wb3J0IHsgc2V0SFRUUFJlc3VsdEhlYWRlcnMsIGdldEN1cnJlbnRIVFRQUmVxdWVzdCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhbGxIVFRQSGFuZGxlclwiO1xuaW1wb3J0IHsgcGVyZm9ybUxvY2FsQ2FsbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhbGxNYW5hZ2VyXCI7XG5pbXBvcnQgeyBSZXF1aXJlQ29udHJvbGxlciB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vcmVxdWlyZS9SZXF1aXJlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uTmFtZSwgZ2V0UHVibGljSWRlbnRpZmllciwgZ2V0T3duTWFjaGluZUlkLCB2ZXJpZnksIHZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSB9IGZyb20gXCIuLi8uLi9taXNjL2h0dHBzL2NlcnRzXCI7XG5pbXBvcnQgeyBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIEZpbmRDb25maWcsIFNvdXJjZUNvbmZpZywgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIGdldExvYWRlZEJ1Y2tldCwgcmVxdWlyZUJ1Y2tldCwgZmluZEJ1Y2tldFN0b3JlLCByZWFkQnVja2V0SW50ZXJuYWwsIHF1ZXVlUm91dGluZ0NvbmZpZ1dyaXRlLFxuICAgIGdldEJ1Y2tldENvbmZpZywgYnVja2V0U3luY1N0YXR1cywgYnVja2V0SW5kZXhUb3RhbHMsIExvYWRlZFN0b3JlLCBBY3RpdmVCdWNrZXRJbmZvLFxuICAgIGxpc3RBY2NvdW50QnVja2V0cywgU2VydmVyQnVja2V0SW5mbywgY2xlYXJBY2NvdW50V3JpdGVTdGF0cyxcbiAgICBnZXRBY3RpdmVCdWNrZXQsIGFjdGl2YXRlQnVja2V0LCBnZXRBY3RpdmVCdWNrZXRLZXlzLFxufSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGdldFRydXN0LCBnZXRSZXF1ZXN0cywgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgSUJ1Y2tldFN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRSb3V0aW5nRmlsZVJlc3VsdCB9IGZyb20gXCIuL2J1Y2tldERpc2tcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyIH0gZnJvbSBcIi4vc3RvcmFnZUNsaWVudENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRyYWNrQWNjZXNzLCB0cmFja0FjY2Vzc0NhbGwsIGdldEFjY2Vzc1RvdGFscywgcmVhZEFjY2Vzc1N1bW1hcmllcywgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMsIEFjY2Vzc1RvdGFscywgQWNjZXNzU3VtbWFyeVN0YXRlIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGFzc2VydFZhbGlkTmFtZSwgYXNzZXJ0VmFsaWRQYXRoLCBhc3NlcnRWYWxpZEFyZ3MgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFN1bW1hcnlFbnRyeSB9IGZyb20gXCIuLi8uLi90cmVlU3VtbWFyeVwiO1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX1NUT1JBR0VfQ0xBU1NfR1VJRCA9IFwiUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXItYjdlNDJhOTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0FVVEhfUFVSUE9TRSA9IFwicmVtb3RlU3RvcmFnZS1hdXRoLTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRF9jZjJmN2IxZVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQUNDRVNTX0RFTklFRCA9IFwiUkVNT1RFX1NUT1JBR0VfQUNDRVNTX0RFTklFRF85ZDgxYTRjMFwiO1xuXG5jb25zdCBBVVRIX1RJTUVfV0lORE9XID0gdGltZUluTWludXRlICogMTA7XG5jb25zdCBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FID0gNTA7XG5jb25zdCBNQVhfU0VTU0lPTlMgPSAxMDAgKiAxMDAwO1xuY29uc3QgTUFYX1JFUVVFU1RTX1BFUl9JUCA9IDUwO1xuXG5leHBvcnQgdHlwZSBBdXRoVG9rZW5EYXRhID0ge1xuICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc2VydmVyOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQXV0aFRva2VuID0ge1xuICAgIGNlcnRQZW06IHN0cmluZztcbiAgICBzaWduYXR1cmU6IHN0cmluZztcbiAgICBkYXRhOiBBdXRoVG9rZW5EYXRhO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc1JlcXVlc3QgPSB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFRydXN0UmVjb3JkID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhhc0FjY2VzczogYm9vbGVhbjtcbiAgICBncmFudEFjY2Vzc0NvbW1hbmQ/OiBzdHJpbmc7XG4gICAgdHJ1c3RlZE1hY2hpbmVzPzogVHJ1c3RSZWNvcmRbXTtcbn07XG5cbmNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gV2UgbXVzdCBuZXZlciBzZXJ2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgYXMgY29kZSAoaHRtbCwganMgLSBhbmQgc3ZnLCB3aGljaCBjYW4gZW1iZWQgPHNjcmlwdD4gYW5kIHJ1bnMgaXQgd2hlbiB2aXNpdGVkIGFzIGEgZG9jdW1lbnQpLiBPdGhlcndpc2UgYSB1c2VyIGNvdWxkIGhvc3QgYSBmaWxlIGFuZCwgYnkgdmlzaXRpbmcgaXQsIHJ1biBpdCBvbiBvdXIgZG9tYWluIC0gZ2l2aW5nIHRoZW0gYWNjZXNzIHRvIGFsbCBvZiBvdXIga2V5cyBhbmQgY29va2llcy4gUERGIHN0YXlzOiBicm93c2VyIFBERiB2aWV3ZXJzIHJ1biBhbnkgZW1iZWRkZWQgUERGIHNjcmlwdGluZyBpbiBhIHNhbmRib3ggd2l0aCBubyBhY2Nlc3MgdG8gdGhlIHNlcnZpbmcgb3JpZ2luJ3MgY29va2llcyBvciBET00uXG5jb25zdCBDT05URU5UX1RZUEVTOiB7IFtleHQ6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGNzczogXCJ0ZXh0L2NzczsgY2hhcnNldD11dGYtOFwiLCBqc29uOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICB0eHQ6IFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiLCBwbmc6IFwiaW1hZ2UvcG5nXCIsIGpwZzogXCJpbWFnZS9qcGVnXCIsIGpwZWc6IFwiaW1hZ2UvanBlZ1wiLCBnaWY6IFwiaW1hZ2UvZ2lmXCIsXG4gICAgd2VicDogXCJpbWFnZS93ZWJwXCIsIG1wNDogXCJ2aWRlby9tcDRcIiwgd2VibTogXCJ2aWRlby93ZWJtXCIsXG4gICAgbXAzOiBcImF1ZGlvL21wZWdcIiwgd2F2OiBcImF1ZGlvL3dhdlwiLCBwZGY6IFwiYXBwbGljYXRpb24vcGRmXCIsXG59O1xuXG5jb25zdCBjb25uZWN0ZWRDbGllbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5mdW5jdGlvbiB0cmFja0NhbGxlcigpOiB2b2lkIHtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgIGlmIChjb25uZWN0ZWRDbGllbnRzLmhhcyhub2RlSWQpKSByZXR1cm47XG4gICAgY29ubmVjdGVkQ2xpZW50cy5hZGQobm9kZUlkKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5vbk5leHREaXNjb25uZWN0KG5vZGVJZCwgKCkgPT4ge1xuICAgICAgICBjb25uZWN0ZWRDbGllbnRzLmRlbGV0ZShub2RlSWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYEJyb2FkY2FzdGluZyByb3V0aW5nIGNvbmZpZyBjaGFuZ2UgdG8gJHtjb25uZWN0ZWRDbGllbnRzLnNpemV9IGNvbm5lY3RlZCBjbGllbnRzYCk7XG4gICAgZm9yIChsZXQgbm9kZUlkIG9mIFsuLi5jb25uZWN0ZWRDbGllbnRzXSkge1xuICAgICAgICB2b2lkIFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW25vZGVJZF0ucm91dGluZ0NvbmZpZ0NoYW5nZWQoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGVyTWFjaGluZUlkKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxlciA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBzZXNzaW9ucy5nZXQoY2FsbGVyLm5vZGVJZCk7XG4gICAgaWYgKCFtYWNoaW5lSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUR9IENhbGwgYXV0aGVudGljYXRlIGZpcnN0IChjb25uZWN0aW9uICR7Y2FsbGVyLm5vZGVJZH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lSWQ7XG59XG5mdW5jdGlvbiBnZXRDYWxsZXJJUCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXROb2RlSWRJUChTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKS5ub2RlSWQpO1xufVxuZnVuY3Rpb24gaXNBZG1pbihtYWNoaW5lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkucm9vdERvbWFpbik7XG59XG5mdW5jdGlvbiByZXF1aXJlQWRtaW4oKTogc3RyaW5nIHtcbiAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgaWYgKCFpc0FkbWluKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gQWRtaW4gY29tbWFuZHMgbXVzdCBiZSBydW4gZnJvbSB0aGUgc3RvcmFnZSBtYWNoaW5lIGl0c2VsZiAoY2FsbGVyIG1hY2hpbmUgJHttYWNoaW5lSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZUFjY2VzcyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmIChpc0FkbWluKG1hY2hpbmVJZCkpIHJldHVybiBtYWNoaW5lSWQ7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgdHJ1c3RlZCA9IGF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICBpZiAoIXRydXN0ZWQpIHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHttYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KGFjY291bnQpfS4gVmlzaXQgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8ke2FjY291bnR9IGZvciBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NvbW1hbmQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB7IHNzaFRhcmdldCwgc2VydmVyQ29tbWFuZCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIHJldHVybiBgc3NoICR7c3NoVGFyZ2V0fSAnJHtzZXJ2ZXJDb21tYW5kfSAtLXJlcXVlc3RJZCAke3JlcXVlc3RJZH0nYDtcbn1cblxuY2xhc3MgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXJCYXNlIHtcbiAgICBhc3luYyBwaW5nKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdHJhY2tDYWxsZXIoKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSh0b2tlbjogQXV0aFRva2VuKTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgdmVyaWZ5KHRva2VuLmNlcnRQZW0sIHRva2VuLnNpZ25hdHVyZSwgdG9rZW4uZGF0YSk7XG4gICAgICAgIGxldCB7IHB1cnBvc2UsIHRpbWUsIHNlcnZlciB9ID0gdG9rZW4uZGF0YTtcbiAgICAgICAgaWYgKHB1cnBvc2UgIT09IFNUT1JBR0VfQVVUSF9QVVJQT1NFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gcHVycG9zZSBpcyAke0pTT04uc3RyaW5naWZ5KHB1cnBvc2UpfSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShTVE9SQUdFX0FVVEhfUFVSUE9TRSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1hdGguYWJzKERhdGUubm93KCkgLSB0aW1lKSA+IEFVVEhfVElNRV9XSU5ET1cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiB0aW1lIGlzIHRvbyBmYXIgZnJvbSB0aGUgc2VydmVyIHRpbWUgKHRva2VuICR7dGltZX0sIHNlcnZlciAke0RhdGUubm93KCl9LCBhbGxvd2VkIGRyaWZ0ICR7QVVUSF9USU1FX1dJTkRPV31tcylgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9rZW5Eb21haW4gPSBzZXJ2ZXIuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICBpZiAodG9rZW5Eb21haW4gIT09IGRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIGlzIGZvciBzZXJ2ZXIgJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXIpfSwgYnV0IHRoaXMgc2VydmVyIGlzICR7SlNPTi5zdHJpbmdpZnkoYCR7ZG9tYWlufToke3BvcnR9YCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBpZiAoIXZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSh7IG1hY2hpbmVJZCwgcHVibGljS2V5OiBnZXRQdWJsaWNJZGVudGlmaWVyKHRva2VuLmNlcnRQZW0pIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGNvbW1vbiBuYW1lICR7SlNPTi5zdHJpbmdpZnkoZ2V0Q29tbW9uTmFtZSh0b2tlbi5jZXJ0UGVtKSl9IGRvZXMgbm90IG1hdGNoIGl0cyBwdWJsaWMga2V5YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vzc2lvbnMuc2V0KGNhbGxlci5ub2RlSWQsIG1hY2hpbmVJZCk7XG4gICAgICAgIHdoaWxlIChzZXNzaW9ucy5zaXplID4gTUFYX1NFU1NJT05TKSB7XG4gICAgICAgICAgICBsZXQgb2xkZXN0ID0gc2Vzc2lvbnMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgICBzZXNzaW9ucy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwOiBnZXRDYWxsZXJJUCgpIH07XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIHJlcXVlc3RBY2Nlc3MoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyByZXF1ZXN0SWQ6IHN0cmluZzsgZ3JhbnRBY2Nlc3NDb21tYW5kOiBzdHJpbmcgfT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCByZXF1ZXN0c1N0b3JhZ2UgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCByZXF1ZXN0c1N0b3JhZ2UuZ2V0KGlwKSB8fCBbXTtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVxdWVzdHMuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nID0ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApLFxuICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaChleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJlcXVlc3RzLmxlbmd0aCA+IE1BWF9SRVFVRVNUU19QRVJfSVApIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIGF3YWl0IHJlcXVlc3RzU3RvcmFnZS5zZXQoaXAsIHJlcXVlc3RzKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcCwgcmVxdWVzdElkOiBleGlzdGluZy5yZXF1ZXN0SWQsIGdyYW50QWNjZXNzQ29tbWFuZDogZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKGV4aXN0aW5nLnJlcXVlc3RJZCkgfTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdGUoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NTdGF0ZT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCBoYXNBY2Nlc3MgPSBpc0FkbWluKG1hY2hpbmVJZCkgfHwgISFhd2FpdCB0cnVzdC5nZXQoYCR7YWNjb3VudH18JHttYWNoaW5lSWR9YCk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFjY2Vzc1N0YXRlID0geyBtYWNoaW5lSWQsIGlwLCBoYXNBY2Nlc3MgfTtcbiAgICAgICAgaWYgKCFoYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgICAgICBsZXQgb3duUmVxdWVzdCA9IChhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKS5maW5kKHggPT4geC5hY2NvdW50ID09PSBhY2NvdW50ICYmIHgubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICAgICAgaWYgKG93blJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZ3JhbnRBY2Nlc3NDb21tYW5kID0gZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKG93blJlcXVlc3QucmVxdWVzdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJ1c3RlZE1hY2hpbmVzOiBUcnVzdFJlY29yZFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYCR7YWNjb3VudH18YCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJlY29yZCA9IGF3YWl0IHRydXN0LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkgdHJ1c3RlZE1hY2hpbmVzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudHJ1c3RlZE1hY2hpbmVzID0gdHJ1c3RlZE1hY2hpbmVzO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGxpc3RSZXF1ZXN0c0ZvcklQKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGlwOiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzUmVxdWVzdFtdPiB7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVxdWVzdHMuZ2V0KGNvbmZpZy5pcCkgfHwgW10pLmZpbHRlcih4ID0+IHguYWNjb3VudCA9PT0gY29uZmlnLmFjY291bnQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IGNhbGxlck1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBmb3IgKGxldCBpcCBvZiBhd2FpdCByZXF1ZXN0cy5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3Qgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCAhPT0gcmVxdWVzdElkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRtaW4oY2FsbGVyTWFjaGluZUlkKSAmJiAhYXdhaXQgdHJ1c3QuZ2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtjYWxsZXJNYWNoaW5lSWR9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gTWFjaGluZSAke2NhbGxlck1hY2hpbmVJZH0gaGFzIG5vIGFjY2VzcyB0byBhY2NvdW50ICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdC5hY2NvdW50KX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICAvKiogQWRtaW4gKHNvIG9ubHkgdGhpcyBtYWNoaW5lJ3Mgb3duIHByb2Nlc3NlcyBjYW4gY2FsbCBpdCk6IHRoZSBidWNrZXRzIHRoaXMgcHJvY2VzcyBoYXMgbG9hZGVkLiBBIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yIHRoaXMsIHNvIGl0IGFjdGl2YXRlcyBleGFjdGx5IHRoZSBidWNrZXRzIHRoYXQgYXJlIGluIHVzZSBpbnN0ZWFkIG9mIGV2ZXJ5IGJ1Y2tldCBvbiBkaXNrLiAqL1xuICAgIGFzeW5jIGFkbWluTGlzdEFjdGl2ZUJ1Y2tldHMoKTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQnVja2V0S2V5cygpO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkxpc3RSZXF1ZXN0cyhjb25maWc6IHsgaXA6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NSZXF1ZXN0W10+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RzLmdldChjb25maWcuaXApIHx8IFtdO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldFwiKVxuICAgIGFzeW5jIGdldDIoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlIGFuZCBldmVuIG91dHNpZGUgdGhlIGJ1Y2tldCAoaXQgaXMgd2hhdCBDUkVBVEVTIGl0KSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGRpc2sgLSBhYnNlbnQgbWVhbnMgdW5kZWZpbmVkLCBleGFjdGx5IGxpa2UgYW55IGZpbGUgcmVhZFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRCdWNrZXRJbnRlcm5hbChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmdldDIoY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwic2V0XCIpXG4gICAgYXN5bmMgc2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBDb3BpZWQgYmVjYXVzZSB0aGUgd2lyZSBoYW5kcyB1cyBhIHBsYWluIFVpbnQ4QXJyYXkgdmlldywgbm90IGEgcmVhbCBCdWZmZXJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShjb25maWcuZGF0YSk7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVldWVSb3V0aW5nQ29uZmlnV3JpdGUoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLnNldCh7IC4uLmNvbmZpZywgZGF0YSB9KSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwiZGVsXCIpXG4gICAgYXN5bmMgZGVsKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmRlbChjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRJbmZvXCIpXG4gICAgYXN5bmMgZ2V0SW5mbyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZ2V0SW5mbyhjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJmaW5kSW5mb1wiKVxuICAgIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHByZWZpeDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZmluZEluZm8oY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwiZ2V0Q2hhbmdlc0FmdGVyXCIpXG4gICAgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyB0aW1lOiBudW1iZXI7IHJvdXRlcz86IFtudW1iZXIsIG51bWJlcl1bXSB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyMihjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFyY2hpdmVzQ29uZmlnKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGF3YWl0IHJlcXVpcmVCdWNrZXQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBsaXN0QnVja2V0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGxpc3RBY2NvdW50QnVja2V0cyhjb25maWcuYWNjb3VudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBUaGUgYWNjZXNzIGhvb2sgKGFuZCB0aGUgc3RvcmFnZSBpdCBpbml0aWFsaXplcykgcnVucyBiZWZvcmUgdGhpcywgc28gYSBsYXJnZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgY2FsbGVyJ3MgdGltaW5nIGlzIHRoZSBob29rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEJ1Y2tldHMoJHtjb25maWcuYWNjb3VudH0pIGNhbGwgYm9keSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzaywgc28gaXQgaXMgY2hlYXAgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGUgYnVja2V0IGlzIGxvYWRlZCBoZXJlLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY3RpdmVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogTG9hZHMgYSBidWNrZXQgdGhhdCBleGlzdHMgb24gdGhpcyBzZXJ2ZXIgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGFjdGl2YXRlQnVja2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhY3RpdmF0ZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICAvKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RCdWNrZXRzIHJlcG9ydHMgYW5kIHRoZSBpbi1tZW1vcnkgYWNjZXNzIHN0YXRpc3RpY3MsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGNsZWFyV3JpdGVTdGF0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgICAgIGNsZWFyQWNjb3VudEFjY2Vzc1N0YXRzKGNvbmZpZy5hY2NvdW50KTtcbiAgICAgICAgcmV0dXJuIHsgY2xlYXJlZEJ1Y2tldHM6IGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoY29uZmlnLmFjY291bnQpIH07XG4gICAgfVxuICAgIC8qKiBJbi1tZW1vcnkgdG90YWxzIHBlciBvcGVyYXRpb24gdHlwZSBzaW5jZSBzdGFydHVwIChvciB0aGUgbGFzdCBjbGVhcldyaXRlU3RhdHMpLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY2Nlc3NTdGF0cyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPEFjY2Vzc1RvdGFscz4ge1xuICAgICAgICByZXR1cm4gZ2V0QWNjZXNzVG90YWxzKGNvbmZpZy5hY2NvdW50KTtcbiAgICB9XG4gICAgLyoqIEEgcGF0aCBicmVha2Rvd24gb2Ygb25lIG9wZXJhdGlvbidzIGFjY2Vzc2VzIChvcGVyYXRpb24gbmFtZXMgY29tZSBmcm9tIGdldEFjY2Vzc1N0YXRzKS4gbWF4Q291bnQgaXMgcGFzc2VkIHN0cmFpZ2h0IHRvIFRyZWVTdW1tYXJ5LmdldFN1bW1hcmllcy4gd2VpZ2h0QnlTaXplIGlzIGlnbm9yZWQgZm9yIGNvdW50LW9ubHkgb3BlcmF0aW9ucywgd2hpY2ggcmV0dXJuIHRoZWlyIGNvdW50IGJyZWFrZG93bi4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3VtbWFyaWVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG9wZXJhdGlvbjogc3RyaW5nOyBtYXhDb3VudDogbnVtYmVyOyB3ZWlnaHRCeVNpemU/OiBib29sZWFuIH0pOiBQcm9taXNlPFN1bW1hcnlFbnRyeTxBY2Nlc3NTdW1tYXJ5U3RhdGU+W10+IHtcbiAgICAgICAgcmV0dXJuIHJlYWRBY2Nlc3NTdW1tYXJpZXMoY29uZmlnKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEluZGV4SW5mbyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0SW5kZXhUb3RhbHMoYXdhaXQgcmVxdWlyZUJ1Y2tldChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldFN5bmNTdGF0dXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0U3luY1N0YXR1cyhhd2FpdCByZXF1aXJlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSkpO1xuICAgIH1cblxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBzdGFydExhcmdlRmlsZShjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYXdhaXQgZmluZEJ1Y2tldFN0b3JlKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnLnNvdXJjZUNvbmZpZyk7XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IHRhcmdldC5zdG9yZS5zdGFydExhcmdlVXBsb2FkKHsgcGF0aDogY29uZmlnLnBhdGgsIGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgLy8gcm91dGVLZXkgcGlucyB0aGUgdXBsb2FkJ3MgcGFydHMgYW5kIGZpbmlzaCB0byB0aGUgc2FtZSBzdG9yZSB0aGUgc3RhcnQgcGlja2VkIChpbi1mbGlnaHQgdXBsb2FkcyBzdXJ2aXZlIGEgYnVja2V0IHJlYnVpbGQ6IHRoZSBwYXJ0IGRhdGEgbGl2ZXMgaW4gdGhlIHN0b3JlJ3MgZm9sZGVyLCB3aGljaCBhIHJlYnVpbHQgc3RvcmUgc3RpbGwgc2VlcylcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLnNldChpZCwgeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUsIHBhdGg6IGNvbmZpZy5wYXRoLCBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlS2V5OiB0YXJnZXQucm91dGVLZXkgfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgYXN5bmMgdXBsb2FkUGFydChjb25maWc6IHsgdXBsb2FkSWQ6IHN0cmluZzsgZGF0YTogQnVmZmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQ6IGluZm8uYWNjb3VudCwgb3BlcmF0aW9uOiBcInVwbG9hZFBhcnRcIiwgcGF0aDogYCR7aW5mby5idWNrZXROYW1lfS8ke2luZm8ucGF0aH1gLCBzaXplOiBjb25maWcuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBhd2FpdCBmaW5kVXBsb2FkU3RvcmUoaW5mbyk7XG4gICAgICAgIGF3YWl0IHRhcmdldC5zdG9yZS5hcHBlbmRMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIGRhdGE6IEJ1ZmZlci5mcm9tKGNvbmZpZy5kYXRhKSB9KTtcbiAgICB9XG4gICAgYXN5bmMgZmluaXNoTGFyZ2VGaWxlKGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uZGVsZXRlKGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBhd2FpdCBmaW5kVXBsb2FkU3RvcmUoaW5mbyk7XG4gICAgICAgIGF3YWl0IHRhcmdldC5zdG9yZS5maW5pc2hMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIHBhdGg6IGluZm8ucGF0aCwgbGFzdE1vZGlmaWVkOiBpbmZvLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG4gICAgLyoqIEJlc3QtZWZmb3J0IGNsZWFudXA6IGFuIHVwbG9hZCB3aG9zZSBidWNrZXQgb3Igc3RvcmUgaGFzIHNpbmNlIHZhbmlzaGVkIGhhcyBub3RoaW5nIGxlZnQgdG8gY2FuY2VsLiAqL1xuICAgIGFzeW5jIGNhbmNlbExhcmdlRmlsZShjb25maWc6IHsgdXBsb2FkSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBpbmZvID0gbGFyZ2VVcGxvYWRJbmZvLmdldChjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLmRlbGV0ZShjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybjtcbiAgICAgICAgY29uc3Qgcm91dGVLZXkgPSBpbmZvLnJvdXRlS2V5O1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYnVja2V0LnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gcm91dGVLZXkpO1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0YXJnZXQuc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQoeyBpZDogY29uZmlnLnVwbG9hZElkIH0pO1xuICAgIH1cblxuICAgIC8vIElNUE9SVEFOVDogV2UgY2FuIG5ldmVyIGV4cG9zZSBlbnVtZXJhdGlvbiAobGlzdGluZywgcHJlZml4IHNlYXJjaCwgY2hhbmdlcyBmZWVkcykgb3ZlciB0aGlzIHB1YmxpYyBIVFRQIGVuZHBvaW50IC0gb25seSBleGFjdC1rZXkgcmVhZHMuIEVudW1lcmF0aW9uIHdvdWxkIGJlIGEgbWFzc2l2ZSBzZWN1cml0eSByaXNrIChwdWJsaWMgYnVja2V0cyByZWx5IG9uIHVuZ3Vlc3NhYmxlIGtleXMgc3RheWluZyB1bmd1ZXNzYWJsZSksIGFuZCBjb3VsZCBhbHNvIGNyYXNoIHRoZSBjbGllbnQgYnkgc2VuZGluZyB0aGVtIHRvbyBtdWNoIGRhdGEuIExpc3RpbmdzIGV4aXN0IG9ubHkgb24gdGhlIGF1dGhlbnRpY2F0ZWQgQVBJIChmaW5kSW5mbyBldGMsIGJlaGluZCBhY2NvdW50QWNjZXNzKS5cbiAgICBhc3luYyBodHRwRW50cnkoY29uZmlnPzogeyByZXF1aXJlQ2FsbHM/OiBzdHJpbmdbXTsgY2FjaGVUaW1lPzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBwYXRobmFtZSA9IG5ldyBVUkwocmVxdWVzdD8udXJsIHx8IFwiL1wiLCBcImh0dHBzOi8vbG9jYWxob3N0XCIpLnBhdGhuYW1lO1xuICAgICAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvZmlsZS9cIikpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgcGVyZm9ybUxvY2FsQ2FsbCh7XG4gICAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgICAgIGNhbGw6IHsgbm9kZUlkOiBjYWxsZXIubm9kZUlkLCBjbGFzc0d1aWQ6IFJlcXVpcmVDb250cm9sbGVyLl9jbGFzc0d1aWQsIGZ1bmN0aW9uTmFtZTogXCJyZXF1aXJlSFRNTFwiLCBhcmdzOiBbY29uZmlnXSB9LFxuICAgICAgICAgICAgfSkgYXMgQnVmZmVyO1xuICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzIHRoZSBhY2Nlc3MgcGFnZSBpcyBzZXJ2ZWQgd2l0aCBubyBjb250ZW50IHR5cGUsIGFuZCBhIGJyb3dzZXIgdGhhdCBpcyB0b2xkIG5vdCB0byBzbmlmZiBzaW1wbHkgd2lsbCBub3QgcmVuZGVyIGl0XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoaHRtbCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IGFjY291bnQgPSBwYXJ0c1sxXTtcbiAgICAgICAgbGV0IGJ1Y2tldE5hbWUgPSBwYXJ0c1syXTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gcGFydHMuc2xpY2UoMykuam9pbihcIi9cIik7XG4gICAgICAgIGlmICghYWNjb3VudCB8fCAhYnVja2V0TmFtZSB8fCAhZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGFjY291bnQsIFwiYWNjb3VudFwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgc3RhdHVzOiBcIjQwNFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVja2V0LnNlbGY/LnB1YmxpYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGlzIG5vdCBwdWJsaWMsIHNvIGl0cyBmaWxlcyBjYW5ub3QgYmUgcmVhZCBvdmVyIHBsYWluIFVSTHNgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbm9ueW1vdXMgVVJMIHJlYWRzIGNhcnJ5IG5vIHNvdXJjZSBzZWxlY3Rpb24gLSB0aGUgZmlsZSdzIHJvdXRlIHBpY2tzIHRoZSBzdG9yZSwgYW5kIGEgcm91dGUgbm8gc3RvcmUgaGVyZSBjb3ZlcnMgaXMgc2ltcGx5IG5vdCBmb3VuZCAodGhlIHJvdXRpbmcgZmlsZSBpdHNlbGYgbGl2ZXMgb3V0c2lkZSBldmVyeSBzdG9yZSlcbiAgICAgICAgbGV0IGh0dHBTdG9yZTogTG9hZGVkU3RvcmUgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpbGVQYXRoICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGh0dHBTdG9yZSA9IGJ1Y2tldC5zdG9yZXMuZmluZChzID0+IHJvdXRlQ29udGFpbnMocy5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgICAgIGluZm8gPSBodHRwU3RvcmUgJiYgYXdhaXQgaHR0cFN0b3JlLnN0b3JlLmdldEluZm8oeyBwYXRoOiBmaWxlUGF0aCB9KSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvIHx8ICFpbmZvLnNpemUpIHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImh0dHBHZXRcIiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtmaWxlUGF0aH1gLCBzaXplOiAwIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ID0gZmlsZVBhdGguc3BsaXQoXCIuXCIpLnBvcCgpIHx8IFwiXCI7XG4gICAgICAgIGxldCBoZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogQ09OVEVOVF9UWVBFU1tleHQudG9Mb3dlckNhc2UoKV0gfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgICAgIFwiTGFzdC1Nb2RpZmllZFwiOiBuZXcgRGF0ZShpbmZvLndyaXRlVGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChidWNrZXQuc2VsZj8uaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7SU1NVVRBQkxFX0NBQ0hFX1RJTUUgLyAxMDAwfWA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlmTW9kaWZpZWRTaW5jZSA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZk1vZGlmaWVkU2luY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBzaW5jZSA9IG5ldyBEYXRlKGlmTW9kaWZpZWRTaW5jZSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKHNpbmNlICYmIE1hdGguZmxvb3IoaW5mby53cml0ZVRpbWUgLyAxMDAwKSAqIDEwMDAgPD0gc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgLi4uaGVhZGVycywgc3RhdHVzOiBcIjMwNFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0Py5oZWFkZXJzW1wicmFuZ2VcIl07XG4gICAgICAgIGlmICh0eXBlb2YgcmFuZ2VIZWFkZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eYnl0ZXM9KFxcZCopLShcXGQqKSQvLmV4ZWMocmFuZ2VIZWFkZXIudHJpbSgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hbMV0gfHwgbWF0Y2hbMl0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgbGV0IGVuZEluY2x1c2l2ZSA9IGluZm8uc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIGluZm8uc2l6ZSAtICttYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSArbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5jbHVzaXZlID0gTWF0aC5taW4oK21hdGNoWzJdLCBpbmZvLnNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gaW5mby5zaXplIHx8IHN0YXJ0ID4gZW5kSW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICovJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjQxNlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYW5nZSA9IHsgc3RhcnQsIGVuZDogZW5kSW5jbHVzaXZlICsgMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChodHRwU3RvcmUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGh0dHBTdG9yZS5zdG9yZS5nZXQyKHsgcGF0aDogZmlsZVBhdGgsIHJhbmdlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0geyAuLi5yZXN1bHQsIGRhdGE6IHJlc3VsdC5kYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCByZXN1bHQuZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIHJlc3VsdC5kYXRhLmxlbmd0aCkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiaHR0cEdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2ZpbGVQYXRofWAsIHNpemU6IHJlc3VsdCAmJiByZXN1bHQuZGF0YS5sZW5ndGggfHwgMCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIHsgLi4uaGVhZGVycywgXCJDb250ZW50LVJhbmdlXCI6IGBieXRlcyAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9LyR7aW5mby5zaXplfWAsIHN0YXR1czogXCIyMDZcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIGhlYWRlcnMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSBvbmUgcmVzb2x1dGlvbiBldmVyeSBkYXRhIGNhbGwgZG9lczogdGhlIGNsaWVudCdzIHNlbGVjdGVkIHNvdXJjZUNvbmZpZyBtYXBzIHRvIGV4YWN0bHkgb25lIHN0b3JlIChsb2FkaW5nIHRoZSBidWNrZXQgLSBhbmQgc28gaW5zdGFudGlhdGluZyBpdHMgc3RvcmVzIC0gaWYgbmVlZGVkKSwgYW5kIGZuIHJ1bnMgb24gaXQuIGZpbmRCdWNrZXRTdG9yZSB0aHJvd3MgZm9yIG1pc3NpbmcgYnVja2V0cyBhbmQgdW5tYXRjaGVkIGNvbmZpZ3MuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoU3RvcmU8VD4oY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB9LCBmbjogKHN0b3JlOiBJQnVja2V0U3RvcmUpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGFyZ2V0ID0gYXdhaXQgZmluZEJ1Y2tldFN0b3JlKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnLnNvdXJjZUNvbmZpZyk7XG4gICAgcmV0dXJuIGF3YWl0IGZuKHRhcmdldC5zdG9yZSk7XG59XG5cbmNvbnN0IGxhcmdlVXBsb2FkSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgcm91dGVLZXk6IHN0cmluZyB9PigpO1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kVXBsb2FkU3RvcmUoaW5mbzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcm91dGVLZXk6IHN0cmluZyB9KTogUHJvbWlzZTxMb2FkZWRTdG9yZT4ge1xuICAgIGxldCBidWNrZXQgPSBhd2FpdCByZXF1aXJlQnVja2V0KGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lKTtcbiAgICBsZXQgdGFyZ2V0ID0gYnVja2V0LnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gaW5mby5yb3V0ZUtleSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RvcmUgKHJvdXRlICR7aW5mby5yb3V0ZUtleX0pIHRoaXMgdXBsb2FkIHRhcmdldHMgbm8gbG9uZ2VyIGV4aXN0cyBvbiBidWNrZXQgJHtpbmZvLmFjY291bnR9LyR7aW5mby5idWNrZXROYW1lfSAoYXZhaWxhYmxlOiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5zdG9yZXMubWFwKHggPT4geC5yb3V0ZUtleSkpfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxuY29uc3QgYWNjb3VudEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjb25maWcgPSBjb250ZXh0LmNhbGwuYXJnc1swXSBhcyB7IGFjY291bnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKFN0cmluZyhjb25maWc/LmFjY291bnQpKTtcbiAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgaWYgKGR1cmF0aW9uID4gQUNDRVNTX0NIRUNLX1NMT1dfVElNRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWNjZXNzIGNoZWNrIGZvciAke2NvbnRleHQuY2FsbC5mdW5jdGlvbk5hbWV9IHRvb2sgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH1cbn07XG5jb25zdCB1cGxvYWRBY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IGNvbnRleHQuY2FsbC5hcmdzWzBdIGFzIHsgdXBsb2FkSWQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoU3RyaW5nKGNvbmZpZz8udXBsb2FkSWQpKTtcbiAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKGluZm8uYWNjb3VudCk7XG59O1xuY29uc3QgYWRtaW5BY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jICgpID0+IHtcbiAgICByZXF1aXJlQWRtaW4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciA9IFNvY2tldEZ1bmN0aW9uLnJlZ2lzdGVyKFxuICAgIFJFTU9URV9TVE9SQUdFX0NMQVNTX0dVSUQsXG4gICAgbmV3IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSgpLFxuICAgICgpID0+ICh7XG4gICAgICAgIHBpbmc6IHt9LFxuICAgICAgICBhdXRoZW50aWNhdGU6IHt9LFxuICAgICAgICByZXF1ZXN0QWNjZXNzOiB7fSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdGU6IHt9LFxuICAgICAgICBsaXN0UmVxdWVzdHNGb3JJUDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdyYW50QWNjZXNzOiB7fSxcbiAgICAgICAgYWRtaW5MaXN0UmVxdWVzdHM6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgYWRtaW5MaXN0QWN0aXZlQnVja2V0czogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBhZG1pbkdyYW50QWNjZXNzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGdldDI6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBzZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBkZWw6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZmluZEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRDaGFuZ2VzQWZ0ZXIyOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QXJjaGl2ZXNDb25maWc6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRJbmRleEluZm86IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBsaXN0QnVja2V0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjdGl2ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGFjdGl2YXRlQnVja2V0OiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgY2xlYXJXcml0ZVN0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY2Nlc3NTdW1tYXJpZXM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRTeW5jU3RhdHVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgc3RhcnRMYXJnZUZpbGU6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICB1cGxvYWRQYXJ0OiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGU6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZTogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgaHR0cEVudHJ5OiB7fSxcbiAgICB9KSxcbiAgICAoKSA9PiAoe1xuICAgICAgICBub0NsaWVudEhvb2tzOiB0cnVlLFxuICAgICAgICBub0RlZmF1bHRIb29rczogdHJ1ZSxcbiAgICB9KVxuKTtcbiJdfQ==
|
|
585
|
+
/* _JS_SOURCE_HASH = "a507ae8ec075e14fd02bbe1b2e2870228406e05afc57436b9a93fbb395998e21"; */
|