@pipeline-builder/pipeline-events 4.0.4 → 4.0.5
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/lib/index.js +148 -32
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -38,14 +38,20 @@ async function loadSdk(pkg) {
|
|
|
38
38
|
* parses them into a normalized format, and POSTs them to the reporting service
|
|
39
39
|
* via PLATFORM_BASE_URL.
|
|
40
40
|
*
|
|
41
|
-
* Authentication:
|
|
42
|
-
*
|
|
43
|
-
*
|
|
41
|
+
* Authentication (#N2 — service-account keys):
|
|
42
|
+
* The Lambda holds an opaque SERVICE-ACCOUNT KEY (`pb_sa_…`), never a JWT, and
|
|
43
|
+
* trades it at platform's `/auth/token/exchange` for a 5-minute token per batch.
|
|
44
|
+
* It verifies NOTHING locally: an opaque key carries no claims to check, and the
|
|
45
|
+
* exchange is the authority (a revoked key stops working within one token
|
|
46
|
+
* lifetime, which is the entire point of the shape). The key is minted by
|
|
47
|
+
* `pipeline-manager infra store-token` and rotated in place by the token-renew
|
|
48
|
+
* Lambda, so the secret's value changes underneath a warm container — which is
|
|
49
|
+
* why an auth failure re-reads the SECRET, not just the token.
|
|
44
50
|
*
|
|
45
51
|
* Environment variables:
|
|
46
52
|
* - PLATFORM_BASE_URL — Base URL of the platform
|
|
47
|
-
* -
|
|
48
|
-
* - PLATFORM_SECRET_NAME — Secrets Manager secret containing { password: <
|
|
53
|
+
* - PLATFORM_ACCESS_KEY — the `pb_sa_…` key set directly (no Secrets Manager call), or
|
|
54
|
+
* - PLATFORM_SECRET_NAME — Secrets Manager secret containing { password: <pb_sa_ key> }
|
|
49
55
|
* - EVENT_DLQ_ARN — (optional) override for the dead-letter queue ARN used by the
|
|
50
56
|
* self-healing redrive; defaults to `<main-queue-arn>-dlq` derived from the SQS
|
|
51
57
|
* trigger's eventSourceARN.
|
|
@@ -164,36 +170,143 @@ async function resolvePipeline(arn, region) {
|
|
|
164
170
|
}
|
|
165
171
|
}
|
|
166
172
|
// ─── Auth ───────────────────────────────────────────────
|
|
173
|
+
//
|
|
174
|
+
// The stored credential is an OPAQUE service-account key (`pb_sa_…`), traded at
|
|
175
|
+
// platform for a short-lived JWT. Nothing is verified here: an opaque key has no
|
|
176
|
+
// claims and no signature, so there is nothing a local check could tell you that
|
|
177
|
+
// the exchange does not tell you better — and the exchange re-reads the account,
|
|
178
|
+
// its org and the key's own state every time, which is what makes a revocation
|
|
179
|
+
// take effect within one token lifetime.
|
|
180
|
+
//
|
|
181
|
+
// This code is deliberately self-contained (see the file header: the Lambda ships
|
|
182
|
+
// as ONE file), so it does not use api-core's exchange client. It keeps the same
|
|
183
|
+
// contract: cache the token in the warm container, refresh EARLY (before expiry)
|
|
184
|
+
// so a batch never presents a token that dies mid-flight, and fail the batch on
|
|
185
|
+
// an exchange failure rather than shipping events unauthenticated.
|
|
186
|
+
/** Refresh at this fraction of the token's life — never at the last moment. */
|
|
187
|
+
const TOKEN_REFRESH_FRACTION = 0.8;
|
|
188
|
+
/** Floor on the cached lifetime, so a surprisingly short TTL can't cause a
|
|
189
|
+
* refresh storm (one exchange per batch at worst). */
|
|
190
|
+
const MIN_TOKEN_CACHE_MS = 30_000;
|
|
191
|
+
/** Per-request timeout for the exchange call. */
|
|
192
|
+
const EXCHANGE_TIMEOUT_MS = 5000;
|
|
193
|
+
/** Access-key prefixes platform issues. A stored JWT is NOT one of these. */
|
|
194
|
+
const ACCESS_KEY_PREFIXES = ['pb_sa_', 'pb_pat_'];
|
|
195
|
+
let cachedKey = null;
|
|
167
196
|
let cachedToken = null;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
197
|
+
let cachedTokenExpiresAt = 0;
|
|
198
|
+
/**
|
|
199
|
+
* Read (and cache) the service-account key: `PLATFORM_ACCESS_KEY` if set,
|
|
200
|
+
* otherwise the `password` field of the Secrets Manager secret named by
|
|
201
|
+
* `PLATFORM_SECRET_NAME`.
|
|
202
|
+
*
|
|
203
|
+
* Fails CLOSED and LOUDLY on a stored JWT. After the #N2 cutover the secret holds
|
|
204
|
+
* a key, and a deployment still carrying the old machine-session JWT would
|
|
205
|
+
* otherwise fail later as an opaque 401 from the reporting API — three layers
|
|
206
|
+
* away from the thing an operator has to fix.
|
|
207
|
+
*/
|
|
208
|
+
async function getAccessKey() {
|
|
209
|
+
if (cachedKey)
|
|
210
|
+
return cachedKey;
|
|
211
|
+
const direct = process.env.PLATFORM_ACCESS_KEY;
|
|
212
|
+
if (direct) {
|
|
213
|
+
assertAccessKey(direct, 'PLATFORM_ACCESS_KEY');
|
|
214
|
+
cachedKey = direct;
|
|
215
|
+
log.info('Using PLATFORM_ACCESS_KEY from environment');
|
|
216
|
+
return cachedKey;
|
|
176
217
|
}
|
|
177
|
-
// Path 2: PLATFORM_SECRET_NAME → read from Secrets Manager
|
|
178
218
|
const secretName = process.env.PLATFORM_SECRET_NAME;
|
|
179
219
|
if (!secretName) {
|
|
180
|
-
throw new Error('
|
|
220
|
+
throw new Error('PLATFORM_ACCESS_KEY or PLATFORM_SECRET_NAME environment variable is required');
|
|
181
221
|
}
|
|
182
|
-
log.info(`Fetching
|
|
222
|
+
log.info(`Fetching access key from Secrets Manager: ${secretName}`);
|
|
183
223
|
const client = new SecretsManagerClient({});
|
|
184
224
|
const response = await client.send(new GetSecretValueCommand({ SecretId: secretName }));
|
|
185
225
|
if (!response.SecretString)
|
|
186
226
|
throw new Error(`Secret "${secretName}" is empty`);
|
|
187
227
|
const secret = JSON.parse(response.SecretString);
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
228
|
+
// `password` stays the canonical field (CodeBuild's secretsManagerCredentials
|
|
229
|
+
// and the plugin-lookup Lambda read the same one) — only its VALUE changed,
|
|
230
|
+
// from a JWT to an opaque key.
|
|
231
|
+
const key = secret.password;
|
|
232
|
+
if (!key) {
|
|
233
|
+
throw new Error(`Secret "${secretName}" missing password — run "pipeline-manager infra store-token" to provision a service-account key`);
|
|
234
|
+
}
|
|
235
|
+
assertAccessKey(key, `secret "${secretName}"`);
|
|
236
|
+
cachedKey = key;
|
|
237
|
+
log.info('Using stored service-account key from Secrets Manager');
|
|
238
|
+
return cachedKey;
|
|
239
|
+
}
|
|
240
|
+
/** Refuse anything that is not an opaque access key, naming where it came from. */
|
|
241
|
+
function assertAccessKey(value, source) {
|
|
242
|
+
if (ACCESS_KEY_PREFIXES.some((p) => value.startsWith(p)))
|
|
243
|
+
return;
|
|
244
|
+
const looksLikeJwt = value.split('.').length === 3;
|
|
245
|
+
throw new Error(`${source} does not hold an opaque access key (expected a "pb_sa_…" value)`
|
|
246
|
+
+ (looksLikeJwt
|
|
247
|
+
? ' — it still holds a JWT from before the service-account cutover. Re-run "pipeline-manager infra store-token" to reissue it as a key.'
|
|
248
|
+
: '.'));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Trade the stored key for a short-lived platform token, cached per warm
|
|
252
|
+
* container until it is 80% through its life. Throws on any failure, which fails
|
|
253
|
+
* the batch so SQS retries it — an unauthenticated ship is never an option.
|
|
254
|
+
*/
|
|
255
|
+
async function getAuthToken() {
|
|
256
|
+
if (cachedToken && Date.now() < cachedTokenExpiresAt)
|
|
257
|
+
return cachedToken;
|
|
258
|
+
const baseUrl = (process.env.PLATFORM_BASE_URL || '').replace(/\/+$/, '');
|
|
259
|
+
if (!baseUrl)
|
|
260
|
+
throw new Error('PLATFORM_BASE_URL environment variable is required');
|
|
261
|
+
const key = await getAccessKey();
|
|
262
|
+
const controller = new AbortController();
|
|
263
|
+
const timer = setTimeout(() => controller.abort(), EXCHANGE_TIMEOUT_MS);
|
|
264
|
+
let res;
|
|
265
|
+
try {
|
|
266
|
+
res = await fetch(`${baseUrl}/api/auth/token/exchange`, {
|
|
267
|
+
method: 'POST',
|
|
268
|
+
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
|
|
269
|
+
body: JSON.stringify({ key }),
|
|
270
|
+
signal: controller.signal,
|
|
271
|
+
});
|
|
193
272
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
273
|
+
finally {
|
|
274
|
+
clearTimeout(timer);
|
|
275
|
+
}
|
|
276
|
+
if (!res.ok) {
|
|
277
|
+
// A rejected key is the one failure an operator has to act on, and platform
|
|
278
|
+
// deliberately answers every refusal the same way — so say what to check
|
|
279
|
+
// rather than echoing an undifferentiated 401.
|
|
280
|
+
if (res.status === 401 || res.status === 403) {
|
|
281
|
+
throw new Error(`Access-key exchange refused (${res.status}) — the stored key is unknown, revoked, expired, `
|
|
282
|
+
+ 'its service account is disabled, or this address is outside the key’s IP allowlist');
|
|
283
|
+
}
|
|
284
|
+
throw new Error(`Access-key exchange failed: ${res.status}`);
|
|
285
|
+
}
|
|
286
|
+
const body = await res.json().catch(() => ({}));
|
|
287
|
+
const accessToken = body.data?.accessToken;
|
|
288
|
+
if (!accessToken)
|
|
289
|
+
throw new Error('Access-key exchange returned no access token');
|
|
290
|
+
const ttlMs = (typeof body.data?.expiresIn === 'number' && body.data.expiresIn > 0 ? body.data.expiresIn : 300) * 1000;
|
|
291
|
+
cachedToken = accessToken;
|
|
292
|
+
cachedTokenExpiresAt = Date.now() + Math.max(MIN_TOKEN_CACHE_MS, ttlMs * TOKEN_REFRESH_FRACTION);
|
|
293
|
+
log.info('Exchanged the stored service-account key for a platform token');
|
|
294
|
+
return accessToken;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Drop everything the container is holding about its credential after a 401/403
|
|
298
|
+
* from the API. The token is dropped for the obvious reason; the KEY is dropped
|
|
299
|
+
* because the token-renew Lambda rotates the secret underneath us — a warm
|
|
300
|
+
* container that only re-exchanged would keep presenting the retired key
|
|
301
|
+
* forever. The next call re-reads the secret and picks up the replacement.
|
|
302
|
+
*/
|
|
303
|
+
function invalidateCredential() {
|
|
304
|
+
cachedToken = null;
|
|
305
|
+
cachedTokenExpiresAt = 0;
|
|
306
|
+
// Only the SECRET path can be refreshed; an env-provided key cannot change
|
|
307
|
+
// without a new container, so keep it rather than re-reading an env var.
|
|
308
|
+
if (!process.env.PLATFORM_ACCESS_KEY)
|
|
309
|
+
cachedKey = null;
|
|
197
310
|
}
|
|
198
311
|
// Per-(pipeline,sha) resolved result — computed once, reused across the many events
|
|
199
312
|
// (PIPELINE/STAGE/ACTION) that share a source revision and across redeliveries.
|
|
@@ -790,11 +903,12 @@ export const handler = async (event) => {
|
|
|
790
903
|
log.info('No resolvable CodePipeline events in batch');
|
|
791
904
|
return;
|
|
792
905
|
}
|
|
793
|
-
// POST batch to reporting service. On a 401/403 the
|
|
794
|
-
//
|
|
795
|
-
//
|
|
796
|
-
//
|
|
797
|
-
//
|
|
906
|
+
// POST batch to reporting service. On a 401/403 the credential this container
|
|
907
|
+
// holds is stale — most often because the token-renew Lambda rotated the key in
|
|
908
|
+
// Secrets Manager — so drop BOTH the cached token and the cached key, re-read,
|
|
909
|
+
// and retry ONCE. `orgId` is INTERNAL (token/health keying) — strip it here so
|
|
910
|
+
// it never rides the wire; the ingest resolves org from the pipeline registry,
|
|
911
|
+
// not the body.
|
|
798
912
|
const payloadEvents = events.map(({ orgId: _orgId, ...rest }) => rest);
|
|
799
913
|
const post = (token) => fetch(`${baseUrl}/api/reports/events`, {
|
|
800
914
|
method: 'POST',
|
|
@@ -803,8 +917,8 @@ export const handler = async (event) => {
|
|
|
803
917
|
});
|
|
804
918
|
let res = await post(await getAuthToken());
|
|
805
919
|
if (res.status === 401 || res.status === 403) {
|
|
806
|
-
log.warn('Reporting API auth failed;
|
|
807
|
-
|
|
920
|
+
log.warn('Reporting API auth failed; re-reading the stored key and retrying once', { status: res.status });
|
|
921
|
+
invalidateCredential();
|
|
808
922
|
res = await post(await getAuthToken());
|
|
809
923
|
}
|
|
810
924
|
if (!res.ok) {
|
|
@@ -847,6 +961,8 @@ export function _resetForTests() {
|
|
|
847
961
|
lastEventAtByOrg.clear();
|
|
848
962
|
lastHealthAt = 0;
|
|
849
963
|
lastRedriveAt = 0;
|
|
964
|
+
cachedKey = null;
|
|
850
965
|
cachedToken = null;
|
|
966
|
+
cachedTokenExpiresAt = 0;
|
|
851
967
|
}
|
|
852
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWtCOUYsSUFBSSxlQUErQyxDQUFDO0FBQ3BELEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsSUFBSSxDQUFDLGVBQWU7UUFBRSxlQUFlLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFrQyxDQUFDO0lBQ3hILE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSxLQUFLLFVBQVUsT0FBTyxDQUFJLEdBQVc7SUFDbkMsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxNQUFNLEdBQUcsR0FBRztJQUNWLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFF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QUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUk7Z0JBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sc0JBQXNCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDckIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUNsQixXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTSU5HTEUtRklMRSBCWSBERVBMT1lNRU5UIENPTlNUUkFJTlQg4oCUIGRvIG5vdCBzcGxpdCB0aGlzIG1vZHVsZS5cbiAqXG4gKiBgcGlwZWxpbmUtbWFuYWdlcmAncyBgc2V0dXAtZXZlbnRzYCBjb21tYW5kIGRlcGxveXMgdGhpcyBMYW1iZGEgYnkgY29weWluZ1xuICogdGhlIGNvbXBpbGVkIGBsaWIvaW5kZXguanNgICoqYXMgb25lIGZpbGUqKiBpbnRvIHRoZSB6aXBcbiAqIChgY29tbWFuZHMvc2V0dXAtZXZlbnRzLnRzYDogYGNvcHlGaWxlU3luYyhoYW5kbGVyU3JjLCBpbmRleC5tanMpYCDihpIgYHppcCAtamApLlxuICogTm90aGluZyBidW5kbGVzIGl0LiBTbyB0aGUgbW9tZW50IHRoaXMgZmlsZSBnYWlucyBhIHJlbGF0aXZlIGltcG9ydCBvZiBhXG4gKiBzaWJsaW5nIG1vZHVsZSwgdGhlIGVtaXR0ZWQgYGxpYi9pbmRleC5qc2AgcmVmZXJlbmNlcyBhIGZpbGUgdGhhdCBpcyBub3QgaW5cbiAqIHRoZSB6aXAgYW5kIHRoZSBMYW1iZGEgZGllcyBhdCBpbml0IHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGUgJy4v4oCmJ1wiLlxuICpcbiAqIFRoYXQgbWFrZXMgdGhlIHVzdWFsIGh5Z2llbmUgaW5zdGluY3Qg4oCUIFwiOTczIGxpbmVzIGFuZCBuaW5lIG1vZHVsZS1sZXZlbFxuICogY2FjaGVzLCBzcGxpdCBpdCBpbnRvIHNjbS1yZXNvbHZlcnMgLyBwYXJzZS1yZWNvcmQgLyBkbHEtaGVhbHRoXCIg4oCUIGFcbiAqIHByb2R1Y3Rpb24gb3V0YWdlIHJhdGhlciB0aGFuIGEgY2xlYW51cC4gSXQgaXMgYWxzbyB3aHkgYF9yZXNldEZvclRlc3RzKClgXG4gKiBleGlzdHM6IHdpdGggZXZlcnkgY2FjaGUgaW4gb25lIG1vZHVsZSwgdGVzdHMgaGF2ZSBubyBvdGhlciBzZWFtLlxuICpcbiAqIElmIHRoaXMgZ2VudWluZWx5IG5lZWRzIHNwbGl0dGluZywgYWRkIGEgYnVuZGxpbmcgc3RlcCAoZXNidWlsZCDihpIgb25lXG4gKiBgbGliL2luZGV4LmpzYCkgdG8gdGhlIGJ1aWxkIEZJUlNULCBhbmQgb25seSB0aGVuIGJyZWFrIHRoZSBmaWxlIHVwLlxuICovXG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIGJ1bmRsZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUvQ29kZUNvbW1pdC9TUVNcbi8vIGNsaWVudHMgYXJlIGxvYWRlZCBsYXppbHkgdmlhIGR5bmFtaWMgaW1wb3J0KCkg4oCUIGEgc3RhdGljIHdvcmtzcGFjZSBkZXBlbmRlbmN5IG9uXG4vLyB0aGVtIHdvdWxkIHBlcnR1cmIgdGhlIHNoYXJlZCBAYXdzLXNkayB2ZXJzaW9uIHRyZWUgYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJ1xuLy8gdHlwaW5ncy4gVGhlIGR5bmFtaWMgaW1wb3J0IGtlZXBzIHRoZW0gb3V0IG9mIHRoZSBzdGF0aWMgZ3JhcGggd2hpbGUgc3RheWluZ1xuLy8gRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpIGFuZCBtb2NrYWJsZS4gTWluaW1hbCBsb2NhbFxuLy8gdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuIGBAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdGAgYW5kXG4vLyBgQGF3cy1zZGsvY2xpZW50LXNxc2AgYXJlIE5PVCBkZXZEZXBlbmRlbmNpZXMgb2YgdGhpcyBwYWNrYWdlICh0aGV5IHJlc29sdmUgb25seVxuLy8gaW5zaWRlIHRoZSBMYW1iZGEgcnVudGltZSAvIGplc3QgbW9ja3MpLCBzbyB0aGV5IGFyZSBpbXBvcnRlZCB0aHJvdWdoIGFcbi8vIHZhcmlhYmxlLXNwZWNpZmllciBoZWxwZXIgYmVsb3cgc28gYHRzY2AgZG9lcyBub3QgdHJ5IHRvIHJlc29sdmUgdGhlbS5cbmludGVyZmFjZSBMaXN0VGFnc091dHB1dCB7IHRhZ3M/OiBBcnJheTx7IGtleT86IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZUNsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPExpc3RUYWdzT3V0cHV0PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lTW9kdWxlIHtcbiAgQ29kZVBpcGVsaW5lQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBDb2RlUGlwZWxpbmVDbGllbnRMaWtlO1xuICBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZDogbmV3IChpbnB1dDogeyByZXNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZXBpcGVsaW5lTW9kOiBDb2RlUGlwZWxpbmVNb2R1bGUgfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29kZVBpcGVsaW5lKCk6IFByb21pc2U8Q29kZVBpcGVsaW5lTW9kdWxlPiB7XG4gIGlmICghY29kZXBpcGVsaW5lTW9kKSBjb2RlcGlwZWxpbmVNb2QgPSAoYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJykpIGFzIHVua25vd24gYXMgQ29kZVBpcGVsaW5lTW9kdWxlO1xuICByZXR1cm4gY29kZXBpcGVsaW5lTW9kO1xufVxuXG4vLyBWYXJpYWJsZS1zcGVjaWZpZXIgbG9hZGVyIGZvciBTREsgY2xpZW50cyB0aGF0IGFyZSBOT1Qgc3RhdGljIGRldkRlcGVuZGVuY2llcyBvZlxuLy8gdGhpcyBwYWNrYWdlIChwcmVzZW50IG9ubHkgaW4gdGhlIExhbWJkYSBydW50aW1lIC8gamVzdCBtb2NrcykuIFBhc3NpbmcgdGhlXG4vLyBzcGVjaWZpZXIgYXMgYSBgc3RyaW5nYCBrZWVwcyBgdHNjYCBmcm9tIHJlc29sdmluZyB0aGUgbW9kdWxlIGF0IGJ1aWxkIHRpbWUuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2RrPFQ+KHBrZzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KHBrZykpIGFzIFQ7XG59XG5cbi8qKlxuICogUGlwZWxpbmUgZXZlbnQgaW5nZXN0aW9uIExhbWJkYSBoYW5kbGVyLlxuICpcbiAqIFJlY2VpdmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgZXZlbnRzIGZyb20gU1FTIChzb3VyY2VkIGJ5IEV2ZW50QnJpZGdlKSxcbiAqIHBhcnNlcyB0aGVtIGludG8gYSBub3JtYWxpemVkIGZvcm1hdCwgYW5kIFBPU1RzIHRoZW0gdG8gdGhlIHJlcG9ydGluZyBzZXJ2aWNlXG4gKiB2aWEgUExBVEZPUk1fQkFTRV9VUkwuXG4gKlxuICogQXV0aGVudGljYXRpb246XG4gKiAtIFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKHByZWZlcnJlZCDigJQgbm8gU2VjcmV0cyBNYW5hZ2VyIGNhbGwpXG4gKiAtIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXIg4oaSIHJlYWRzIHRoZSBKV1QgKHBhc3N3b3JkKSBmcm9tIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gUExBVEZPUk1fQkFTRV9VUkwg4oCUIEJhc2UgVVJMIG9mIHRoZSBwbGF0Zm9ybVxuICogLSBQTEFURk9STV9UT0tFTiDigJQgSldUIHRva2VuIChzZXQgZGlyZWN0bHksIG9yKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSDigJQgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHsgcGFzc3dvcmQ6IDxKV1Q+IH1cbiAqIC0gRVZFTlRfRExRX0FSTiDigJQgKG9wdGlvbmFsKSBvdmVycmlkZSBmb3IgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIEFSTiB1c2VkIGJ5IHRoZVxuICogICBzZWxmLWhlYWxpbmcgcmVkcml2ZTsgZGVmYXVsdHMgdG8gYDxtYWluLXF1ZXVlLWFybj4tZGxxYCBkZXJpdmVkIGZyb20gdGhlIFNRU1xuICogICB0cmlnZ2VyJ3MgZXZlbnRTb3VyY2VBUk4uXG4gKi9cblxuY29uc3QgbG9nID0ge1xuICBpbmZvOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnSU5GTycsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIHdhcm46IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdXQVJOJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgZXJyb3I6IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0VSUk9SJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbn07XG5cbi8vIOKUgOKUgCBUYWcgcmVzb2x1dGlvbjogcGIucGlwZWxpbmUtaWQgKyBwYi5kZXBsb3lzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGlwZWxpbmVzIGFyZSB0YWdnZWQgYXQgQ0RLIHN5bnRoIHdpdGg6XG4vLyAgIHBiLnBpcGVsaW5lLWlkID0gPHBsYXRmb3JtIHBpcGVsaW5lSWQ+XG4vLyAgIHBiLmRlcGxveXMgICAgID0gPHN0YWdlPjo8ZW52PiBwYWlycyBqb2luZWQgYnkgJysnLCBlLmcuXG4vLyAgICAgICAgICAgICAgICAgICAgXCJEZXBsb3ktc3RnOnN0YWdpbmcrRGVwbG95LXByb2Q6cHJvZHVjdGlvblwiXG4vLyBXZSByZXNvbHZlIHRob3NlIHRhZ3MgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkuIFRoZSBBUk4vYWNjb3VudFxuLy8gbmV2ZXIgbGVhdmUgQVdTLCBzbyB0aGVyZSdzIG5vIG1hc2tpbmcuIENhY2hlZCBwZXIgQVJOICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWRcbi8vIGhhbW1lcmluZyB0aGUgTGlzdFRhZ3MgQVBJLlxuLy9cbi8vIFJlcXVpcmVzIHRoZSBMYW1iZGEgZXhlY3V0aW9uIHJvbGUgdG8gYWxsb3cgYGNvZGVwaXBlbGluZTpMaXN0VGFnc0ZvclJlc291cmNlYC5cbi8vIEFjY2Vzc0RlbmllZCBpcyBhIGNvbmZpZyBlcnJvciAoYWxlcnQgbG91ZGx5KTsgYSBtaXNzaW5nIHBiLnBpcGVsaW5lLWlkIHRhZyBpc1xuLy8gdHJlYXRlZCBhcyBcIm5vdCB5ZXQgcmVnaXN0ZXJlZFwiIChza2lwKS5cblxuY29uc3QgUElQRUxJTkVfSURfVEFHID0gJ3BiLnBpcGVsaW5lLWlkJztcbmNvbnN0IERFUExPWVNfVEFHID0gJ3BiLmRlcGxveXMnO1xuLy8gQ2Fub25pY2FsIHBlci1waXBlbGluZSBvcmcgdGFnIChhcHBsaWVkIGF0IHN5bnRoIGJ5IHBpcGVsaW5lLWNvcmUpLiBJdCBpcyB0aGVcbi8vIFJFU09MVkVEIG9yZyBmb3IgZXZlcnkgZXZlbnQgb2YgdGhpcyBwaXBlbGluZSDigJQgdXNlZCB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViXG4vLyB0b2tlbiBhbmQgdG8gYXR0cmlidXRlIGluZ2VzdC1oZWFsdGguIG9yZ0lkIGlzIGEgcGxhdGZvcm0gaWQsIG5ldmVyIGFuIEFXU1xuLy8gYWNjb3VudCBpZCwgc28gaXQgaXMgc2FmZSB0byByZWFkL2ZvcndhcmQuXG5jb25zdCBPUkdfSURfVEFHID0gJ09yZ0lkJztcbmNvbnN0IGNsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBDb2RlUGlwZWxpbmVDbGllbnRMaWtlPigpO1xuLy8gcGlwZWxpbmVJZD1udWxsIGlzIGEgbmVnYXRpdmUgY2FjaGUgKHJlc29sdmVkLWJ1dC11bnRhZ2dlZCk7IGB0c2AgbGV0cyBuZWdhdGl2ZXNcbi8vIGV4cGlyZSBzbyBhIHBpcGVsaW5lIHRhZ2dlZCBBRlRFUiBpdHMgZmlyc3QgZXZlbnQgYmVjb21lcyByZXNvbHZhYmxlIHdpdGhvdXRcbi8vIHJlY3ljbGluZyB0aGUgd2FybSBjb250YWluZXIuIFBvc2l0aXZlIHJlc3VsdHMgc3RheSBjYWNoZWQgZm9yIHRoZSBsaWZldGltZS5cbmNvbnN0IHJlc29sdmVkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBvcmdJZDogc3RyaW5nIHwgbnVsbDsgZGVwbG95czogTWFwPHN0cmluZywgc3RyaW5nPjsgdHM6IG51bWJlciB9PigpO1xuY29uc3QgTkVHX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBSZXNvbHZlZCBwaXBlbGluZSBtZXRhZGF0YSByZWFkIGZyb20gdGhlIENvZGVQaXBlbGluZSByZXNvdXJjZSB0YWdzLiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkUGlwZWxpbmUge1xuICAvKiogUGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQgdGFnKTsgbnVsbCB3aGVuIHVudGFnZ2VkL3VucmVnaXN0ZXJlZC4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBsYXRmb3JtIG9yZ0lkIChPcmdJZCB0YWcpOyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGNhcnJpZXMgbm8gb3JnIHRhZy4gKi9cbiAgb3JnSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBNYXAgb2YgZGVwbG95LXN0YWdlIG5hbWUg4oaSIGVudmlyb25tZW50IChwYXJzZWQgZnJvbSBwYi5kZXBsb3lzKS4gRW1wdHkgd2hlbiBub25lLiAqL1xuICBkZXBsb3lzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKiogQ2FwIG9uIGNvbW1pdC9yZWYvZW52aXJvbm1lbnQgZmllbGRzIOKAlCB0aGUgaW5nZXN0IGNvbnRyYWN0IGFsbG93cyBtYXggMjU1LiAqL1xuY29uc3QgTUFYX0FUVFIgPSAyNTU7XG5cbi8qKlxuICogUGFyc2UgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgaW50byBhIHN0YWdl4oaSZW52aXJvbm1lbnQgbWFwLiBUaGUgdmFsdWUgaXNcbiAqIGA8c3RhZ2U+OjxlbnY+YCBwYWlycyBqb2luZWQgYnkgYCtgIChDb2RlUGlwZWxpbmUtdGFnLXNhZmU7IG5vIEpTT04pLiBBIHN0YWdlXG4gKiBwcmVzZW50IGhlcmUgaXMgYSBkZXBsb3k7IGl0cyBtYXBwZWQgZW52aXJvbm1lbnQgaXMgd2hhdCB0aGUgZm9yd2FyZGVyIHN0YW1wcyBvblxuICogdGhhdCBzdGFnZSdzIFNUQUdFL0FDVElPTiBldmVudHMgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gTWFsZm9ybWVkIHBhaXJzIGFyZVxuICogc2tpcHBlZCBkZWZlbnNpdmVseS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEZXBsb3lzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG1hcDtcbiAgZm9yIChjb25zdCBwYWlyIG9mIHZhbHVlLnNwbGl0KCcrJykpIHtcbiAgICBjb25zdCBpZHggPSBwYWlyLmluZGV4T2YoJzonKTtcbiAgICBpZiAoaWR4IDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YWdlID0gcGFpci5zbGljZSgwLCBpZHgpLnRyaW0oKTtcbiAgICBjb25zdCBlbnYgPSBwYWlyLnNsaWNlKGlkeCArIDEpLnRyaW0oKTtcbiAgICBpZiAoc3RhZ2UgJiYgZW52KSBtYXAuc2V0KHN0YWdlLCBlbnYuc2xpY2UoMCwgTUFYX0FUVFIpKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyB0YWdzIOKGkiB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQpIHBsdXMgdGhlXG4gKiBkZXBsb3ktc3RhZ2XihpJlbnZpcm9ubWVudCBtYXAgKHBiLmRlcGxveXMpLiBgcGlwZWxpbmVJZGAgaXMgbnVsbCB3aGVuIHRoZSBwaXBlbGluZVxuICogaGFzIG5vIHBiLnBpcGVsaW5lLWlkIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNXG4gKiBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpcGVsaW5lKGFybjogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8UmVzb2x2ZWRQaXBlbGluZT4ge1xuICBjb25zdCBjYWNoZWQgPSByZXNvbHZlZEJ5QXJuLmdldChhcm4pO1xuICAvLyBTZXJ2ZSBhIHBvc2l0aXZlIGhpdCBmb3IgdGhlIGNvbnRhaW5lciBsaWZldGltZTsgc2VydmUgYSBuZWdhdGl2ZSBoaXQgb25seVxuICAvLyB1bnRpbCBpdCBleHBpcmVzICh0aGVuIHJlLXJlc29sdmUsIGluIGNhc2UgdGhlIHBpcGVsaW5lIHdhcyBzaW5jZSB0YWdnZWQpLlxuICBpZiAoY2FjaGVkICYmIChjYWNoZWQucGlwZWxpbmVJZCAhPT0gbnVsbCB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBjYWNoZWQucGlwZWxpbmVJZCwgb3JnSWQ6IGNhY2hlZC5vcmdJZCwgZGVwbG95czogY2FjaGVkLmRlcGxveXMgfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBQSVBFTElORV9JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IG9yZ0lkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gT1JHX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgY29uc3QgZGVwbG95cyA9IHBhcnNlRGVwbG95cyhvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBERVBMT1lTX1RBRyk/LnZhbHVlKTtcbiAgICBpZiAoIXBpcGVsaW5lSWQpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIHBiLnBpcGVsaW5lLWlkIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICByZXNvbHZlZEJ5QXJuLnNldChhcm4sIHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgLy8gVHJhbnNpZW50L2luZnJhIGVycm9ycyAodGhyb3R0bGluZywgdGltZW91dHMsIDV4eCkgTVVTVCBwcm9wYWdhdGUgc28gdGhlIFNRU1xuICAgIC8vIGJhdGNoIGlzIHJldHJpZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlIGV2ZW50IOKAlCBhbiBldmVudCBkcm9wcGVkXG4gICAgLy8gQkVGT1JFIGl0IHJlYWNoZXMgdGhlIGluZ2VzdCBpcyBsb3N0IHBlcm1hbmVudGx5ICh0aGUgaW5nZXN0J3MgcGFydGlhbC11bmlxdWVcbiAgICAvLyBpbmRleCBvbmx5IGRlZHVwZXMgZXZlbnRzIHRoYXQgd2VyZSBhY3R1YWxseSBQT1NUZWQpLiBPbmx5IHN3YWxsb3cgd2hlbiB0aGVcbiAgICAvLyBmYWlsdXJlIGlzIGEgZGVmaW5pdGl2ZSBhbnN3ZXIgdGhhdCB0aGlzIEFSTiBoYXMgbm8gdXNhYmxlIHRhZy5cbiAgICBjb25zdCBlID0gZXJyIGFzIHsgbmFtZT86IHN0cmluZzsgJHJldHJ5YWJsZT86IHVua25vd247ICRtZXRhZGF0YT86IHsgaHR0cFN0YXR1c0NvZGU/OiBudW1iZXIgfSB9O1xuICAgIGNvbnN0IHN0YXR1cyA9IGUuJG1ldGFkYXRhPy5odHRwU3RhdHVzQ29kZTtcbiAgICBjb25zdCByZXRyeWFibGUgPSBlLiRyZXRyeWFibGUgIT0gbnVsbFxuICAgICAgfHwgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIHN0YXR1cyA+PSA1MDApXG4gICAgICB8fCAvdGhyb3R0bHx0aW1lb3V0fHRvb21hbnlyZXF1ZXN0c3xzZXJ2aWNldW5hdmFpbGFibGV8ZWNvbm5yZXNldHxuZXR3b3JraW5nZXJyb3IvaS50ZXN0KG5hbWUgPz8gJycpO1xuICAgIGlmIChyZXRyeWFibGUpIHtcbiAgICAgIGxvZy5lcnJvcignVHJhbnNpZW50IGVycm9yIHJlc29sdmluZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHdpbGwgcmV0cnkgdGhlIGJhdGNoJywgeyBhcm4sIGVycm9yOiBuYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIHBiLnBpcGVsaW5lLWlkIHRhZycsIHsgYXJuLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBudWxsLCBvcmdJZDogbnVsbCwgZGVwbG95czogbmV3IE1hcCgpIH07XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8vIGluZnJhIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgSldUIGluIGBwYXNzd29yZGAgKHRoZSBjYW5vbmljYWwgZmllbGQg4oCUIGFsc28gdXNlZCBieVxuICAvLyBDb2RlQnVpbGQgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhLCBhbmQgdG9rZW4tcmVuZXcpLlxuICBjb25zdCB0b2tlbiA9IHNlY3JldC5wYXNzd29yZDtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VjcmV0IG1pc3NpbmcgSldUIChwYXNzd29yZCkg4oCUIHJ1biBcInBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5cIiB0byBnZW5lcmF0ZScpO1xuICB9XG5cbiAgY2FjaGVkVG9rZW4gPSB0b2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgUGhhc2UgNDogaW4tYWNjb3VudCBjb21taXQtcmFuZ2UgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEZvciBhIHNvdXJjZS9kZXBsb3kgZXZlbnQgY2FycnlpbmcgYSBjb21taXRTaGEgd2UgcmVzb2x2ZSB0aGUgY29tbWl0IHRpbWVzdGFtcFxuLy8gKGFuZCBob3cgbWFueSBjb21taXRzIHNoaXBwZWQpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3QgcmVzb2x2ZWQgc2hhIG9mIHRoZVxuLy8gc2FtZSBwaXBlbGluZSDigJQgZW50aXJlbHkgSU4tQUNDT1VOVCwgcGVyIHNvdXJjZSB0eXBlOlxuLy8gICDigKIgQ29kZUNvbW1pdCAg4oaSIEFXUyBTREsgR2V0Q29tbWl0ICh3YWxrIGZpcnN0LXBhcmVudHMgYmFjayB0byB0aGUgYm91bmRhcnkpLlxuLy8gICDigKIgR2l0SHViL0NvZGVDb25uZWN0aW9ucy1HaXRIdWIg4oaSIEdpdEh1YiBSRVNUIGNvbXBhcmUvY29tbWl0cyBBUEkuIEF1dGhlbnRpY2F0ZWRcbi8vICAgICB3aXRoIHRoZSBvcmcncyBgcGlwZWxpbmUtYnVpbGRlci97b3JnSWR9L2dpdGh1Yi10b2tlbmAgc2VjcmV0IHdoZW4gcHJlc2VudFxuLy8gICAgIChkZXJpdmVkIGZyb20gUExBVEZPUk1fU0VDUkVUX05BTUUpLCBvdGhlcndpc2UgYmVzdC1lZmZvcnQgdW5hdXRoZW50aWNhdGVkLlxuLy8gICDigKIgQml0YnVja2V0ICAg4oaSIEJpdGJ1Y2tldCBSRVNUIGNvbW1pdCBBUEkgKHNpbmdsZS1jb21taXQ7IHJhbmdlIHdhbGsgb21pdHRlZCkuXG4vLyBUaGUgb2xkZXN0IHVuc2hpcHBlZCBjb21taXQncyB0aW1lc3RhbXAg4oaSIGBjb21taXRUaW1lc3RhbXBgOyB0aGUgbnVtYmVyIG9mIGNvbW1pdHNcbi8vIGluIHRoZSByYW5nZSDihpIgYGNvbW1pdENvdW50YC4gRXZlcnl0aGluZyBoZXJlIGlzIEJFU1QtRUZGT1JUOiBvbiBhbnkgZmFpbHVyZSB0aGVcbi8vIGZpZWxkcyBhcmUgc2ltcGx5IG9taXR0ZWQgKHJlcG9ydGluZyBmYWxscyBiYWNrIHRvIGB1bmtub3duYCkuIEl0IG11c3QgTkVWRVIgZmFpbFxuLy8gdGhlIGJhdGNoLlxuLy9cbi8vIElBTSByZXF1aXJlZCBieSB0aGlzIHBhdGggKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIOKAoiBjb2RlY29tbWl0OkdldENvbW1pdCAgICAgICAgICAgIChDb2RlQ29tbWl0IHNvdXJjZXMpXG4vLyAgIOKAoiBzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSBvbiBgcGlwZWxpbmUtYnVpbGRlci8qL2dpdGh1Yi10b2tlbmAgKHRva2VuIFNDTSBzb3VyY2VzKVxuXG50eXBlIFNvdXJjZVByb3ZpZGVyID0gJ2dpdGh1YicgfCAnYml0YnVja2V0JyB8ICdjb2RlY29tbWl0JyB8ICd1bmtub3duJztcbmludGVyZmFjZSBTb3VyY2VSZWYge1xuICBzaGE6IHN0cmluZztcbiAgcHJvdmlkZXI6IFNvdXJjZVByb3ZpZGVyO1xuICBvd25lcj86IHN0cmluZztcbiAgcmVwbz86IHN0cmluZztcbiAgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgQ29tbWl0SW5mbyB7IGNvbW1pdFRpbWVzdGFtcD86IHN0cmluZzsgY29tbWl0Q291bnQ/OiBudW1iZXIgfVxuXG4vLyBQZXItKHBpcGVsaW5lLHNoYSkgcmVzb2x2ZWQgcmVzdWx0IOKAlCBjb21wdXRlZCBvbmNlLCByZXVzZWQgYWNyb3NzIHRoZSBtYW55IGV2ZW50c1xuLy8gKFBJUEVMSU5FL1NUQUdFL0FDVElPTikgdGhhdCBzaGFyZSBhIHNvdXJjZSByZXZpc2lvbiBhbmQgYWNyb3NzIHJlZGVsaXZlcmllcy5cbmNvbnN0IGNvbW1pdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENvbW1pdEluZm8+KCk7XG4vLyBMYXN0IHNoYSB3ZSBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgcGVyIHBpcGVsaW5lIOKAlCB0aGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kIGZvciB0aGVcbi8vIG5leHQgcmFuZ2UgKFwiY29tbWl0cyBzaW5jZSB0aGUgbGFzdCBkZXBsb3lcIikuIEluLW1lbW9yeSBvbmx5OiBhIGNvbGQgc3RhcnQgcmVzZXRzXG4vLyBpdCwgc28gdGhlIGZpcnN0IHBvc3QtY29sZCBldmVudCByZXNvbHZlcyBhcyBhIHNpbmdsZSBjb21taXQgKGV4cGVjdGVkLCBkZWZlbnNpdmUpLlxuY29uc3QgbGFzdFNoYUJ5UGlwZWxpbmUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuLy8gUGVyLXNoYSBDb2RlQ29tbWl0IG1ldGFkYXRhIGNhY2hlIChkYXRlICsgZmlyc3QtcGFyZW50KSBmb3IgcmFuZ2Ugd2Fsa3MuXG5jb25zdCBjb21taXRNZXRhQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBkYXRlPzogc3RyaW5nOyBwYXJlbnRzPzogc3RyaW5nW10gfT4oKTtcbi8vIFNDTSByYXRlLWxpbWl0IGNvb2xkb3duOiBhZnRlciBhIDQwMy80Mjkgd2Ugc3RvcCBjYWxsaW5nIHRoZSBTQ00gZm9yIGEgd2hpbGUuXG5sZXQgc2NtQ29vbGRvd25VbnRpbCA9IDA7XG5jb25zdCBTQ01fQ09PTERPV05fTVMgPSAyICogNjAgKiAxMDAwO1xuLy8gQ2FwIHRoZSBDb2RlQ29tbWl0IGZpcnN0LXBhcmVudCB3YWxrIHNvIGEgbG9uZyByYW5nZSBjYW4ndCBibG93IHRoZSBMYW1iZGEgdGltZW91dC5cbmNvbnN0IE1BWF9DT01NSVRfV0FMSyA9IDUwO1xuLy8gUGVyLXJlcXVlc3QgdGltZW91dCBmb3IgZXh0ZXJuYWwgU0NNIGNhbGxzIChkZWZlbnNpdmUgYWdhaW5zdCBzbG93L2h1bmcgaG9zdHMpLlxuY29uc3QgU0NNX0ZFVENIX1RJTUVPVVRfTVMgPSAzMDAwO1xuXG4vLyBUaGUgZm9yd2FyZGVyIGlzIGEgZmxlZXQgTGFtYmRhOiBvbmUgd2FybSBjb250YWluZXIgcmVzb2x2ZXMgZXZlbnRzIGZvciBNQU5ZXG4vLyBvcmdzLCBzbyB0aGUgR2l0SHViIHRva2VuIE1VU1QgYmUga2V5ZWQgYnkgdGhlIGV2ZW50J3MgcmVzb2x2ZWQgb3JnIChub3QgYSBzaW5nbGVcbi8vIGNvbnRhaW5lci1nbG9iYWwgdG9rZW4pLiBFYWNoIG9yZydzIHRva2VuIGxpdmVzIGF0IGA8cHJlZml4Pi88b3JnSWQ+L2dpdGh1Yi10b2tlbmAsXG4vLyBkZXJpdmVkIGZyb20gUExBVEZPUk1fU0VDUkVUX05BTUUgKGA8cHJlZml4Pi88Y29udGFpbmVyT3JnPi9wbGF0Zm9ybWApLiBudWxsIGNhY2hlc1xuLy8gYSBkZWZpbml0aXZlIG1pc3MgKG5vIHNlY3JldCAvIHJlYWQgZmFpbGVkKSDihpIgdW5hdXRoZW50aWNhdGVkIGJlc3QtZWZmb3J0LlxuY29uc3QgZ2l0aHViVG9rZW5CeU9yZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXG4vKipcbiAqIERlcml2ZSBhIHNwZWNpZmljIG9yZydzIGdpdGh1Yi10b2tlbiBzZWNyZXQgbmFtZSBmcm9tIFBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gKiAoYDxwcmVmaXg+Lzxjb250YWluZXJPcmc+L3BsYXRmb3JtYCkuIFdpdGggYW4gYG9yZ0lkYCB3ZSBzd2FwIHRoZSBvcmcgc2VnbWVudFxuICogKGA8cHJlZml4Pi88b3JnSWQ+L2dpdGh1Yi10b2tlbmApOyB3aXRob3V0IG9uZSAocGlwZWxpbmUgY2FycmllZCBubyBPcmdJZCB0YWcpIHdlXG4gKiBmYWxsIGJhY2sgdG8gdGhlIGNvbnRhaW5lcidzIG93biBzaWJsaW5nIHNlY3JldC4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogUExBVEZPUk1fU0VDUkVUX05BTUUgaXNuJ3QgdGhlIGV4cGVjdGVkIGAuLi4vcGxhdGZvcm1gIHNoYXBlLlxuICovXG5mdW5jdGlvbiBnaXRodWJUb2tlblNlY3JldE5hbWUob3JnSWQ6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBuYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghbmFtZSB8fCAhbmFtZS5lbmRzV2l0aCgnL3BsYXRmb3JtJykpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhc2UgPSBuYW1lLnNsaWNlKDAsIC0nL3BsYXRmb3JtJy5sZW5ndGgpOyAvLyA8cHJlZml4Pi88Y29udGFpbmVyT3JnPlxuICBpZiAob3JnSWQpIHtcbiAgICBjb25zdCBzbGFzaCA9IGJhc2UubGFzdEluZGV4T2YoJy8nKTtcbiAgICBjb25zdCBwcmVmaXggPSBzbGFzaCA+IDAgPyBiYXNlLnNsaWNlKDAsIHNsYXNoKSA6IGJhc2U7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0vJHtvcmdJZH0vZ2l0aHViLXRva2VuYDtcbiAgfVxuICByZXR1cm4gYCR7YmFzZX0vZ2l0aHViLXRva2VuYDtcbn1cblxuLyoqIFJlYWQgKGFuZCBjYWNoZSwgcGVyIG9yZykgdGhlIG9yZyBnaXRodWIgdG9rZW47IG51bGwg4oaSIHVuYXV0aGVudGljYXRlZCBiZXN0LWVmZm9ydC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG9yZ0lkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IGtleSA9IG9yZ0lkID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBnaXRodWJUb2tlbkJ5T3JnLmdldChrZXkpO1xuICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSBnaXRodWJUb2tlblNlY3JldE5hbWUob3JnSWQpO1xuICBpZiAoIXNlY3JldE5hbWUpIHsgZ2l0aHViVG9rZW5CeU9yZy5zZXQoa2V5LCBudWxsKTsgcmV0dXJuIG51bGw7IH1cbiAgbGV0IHRva2VuOiBzdHJpbmcgfCBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7IFNlY3JldElkOiBzZWNyZXROYW1lIH0pKTtcbiAgICAvLyBUaGUgZ2l0aHViLXRva2VuIHNlY3JldCBpcyBhIFJBVyB0b2tlbiBzdHJpbmcgKG5vdCBKU09OIOKAlCBDREsgcmVzb2x2ZXMgaXQgdmlhXG4gICAgLy8gdGhlIGRlZmF1bHQgU2VjcmV0U3RyaW5nIHdpdGggbm8ga2V5KS5cbiAgICB0b2tlbiA9IHJlcy5TZWNyZXRTdHJpbmcgJiYgcmVzLlNlY3JldFN0cmluZy5sZW5ndGggPiAwID8gcmVzLlNlY3JldFN0cmluZy50cmltKCkgOiBudWxsO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignTm8gZ2l0aHViLXRva2VuIHNlY3JldCDigJQgR2l0SHViIGNvbW1pdCByZXNvbHV0aW9uIHdpbGwgYmUgdW5hdXRoZW50aWNhdGVkJywgeyBvcmdJZCwgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lIH0pO1xuICAgIHRva2VuID0gbnVsbDtcbiAgfVxuICBnaXRodWJUb2tlbkJ5T3JnLnNldChrZXksIHRva2VuKTtcbiAgcmV0dXJuIHRva2VuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybDogc3RyaW5nLCBvcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgU0NNX0ZFVENIX1RJTUVPVVRfTVMpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmZXRjaCh1cmwsIHsgLi4ub3B0cywgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG59XG5cbi8qKiBOb3JtYWxpemUgYSBjb21taXQgZGF0ZSB0byBJU08gODYwMS4gQWNjZXB0cyBJU08gc3RyaW5ncyBhbmQgQ29kZUNvbW1pdCdzXG4gKiAgXCI8ZXBvY2gtc2Vjb25kcz4gK1paWlpcIiBmb3JtLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHVucGFyc2VhYmxlLiAqL1xuZnVuY3Rpb24gdG9Jc28odmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVwb2NoID0gL14oXFxkezksfSlcXGIvLmV4ZWModmFsdWUudHJpbSgpKTtcbiAgaWYgKGVwb2NoKSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKE51bWJlcihlcG9jaFsxXSkgKiAxMDAwKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGQudG9JU09TdHJpbmcoKTtcbiAgfVxuICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGQudG9JU09TdHJpbmcoKTtcbn1cblxuLyoqIENsYXNzaWZ5IGEgc291cmNlLXJldmlzaW9uIFVSTCBpbnRvIGEgcHJvdmlkZXIgKyByZXBvIGNvb3JkaW5hdGVzLiAqL1xuZnVuY3Rpb24gY2xhc3NpZnlTb3VyY2UodXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPbWl0PFNvdXJjZVJlZiwgJ3NoYSc+IHtcbiAgaWYgKCF1cmwpIHJldHVybiB7IHByb3ZpZGVyOiAndW5rbm93bicgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IGhvc3QgPSB1Lmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhvc3QgPT09ICdnaXRodWIuY29tJyB8fCBob3N0LmVuZHNXaXRoKCcuZ2l0aHViLmNvbScpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IDIpIHJldHVybiB7IHByb3ZpZGVyOiAnZ2l0aHViJywgb3duZXI6IHBhcnRzWzBdLCByZXBvOiBwYXJ0c1sxXS5yZXBsYWNlKC9cXC5naXQkLywgJycpIH07XG4gICAgfVxuICAgIGlmIChob3N0ID09PSAnYml0YnVja2V0Lm9yZycpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikgcmV0dXJuIHsgcHJvdmlkZXI6ICdiaXRidWNrZXQnLCBvd25lcjogcGFydHNbMF0sIHJlcG86IHBhcnRzWzFdLnJlcGxhY2UoL1xcLmdpdCQvLCAnJykgfTtcbiAgICB9XG4gICAgaWYgKHUucGF0aG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnY29kZWNvbW1pdCcpIHx8IHUuaGFzaC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb2RlY29tbWl0JykgfHwgdS5wYXRobmFtZS5pbmNsdWRlcygnL3JlcG9zaXRvcmllcy8nKSkge1xuICAgICAgY29uc3QgbSA9IC9yZXBvc2l0b3IoPzp5fGllcylcXC8oW14vIz9dKykvLmV4ZWModS5wYXRobmFtZSArIHUuaGFzaCk7XG4gICAgICBpZiAobSkgcmV0dXJuIHsgcHJvdmlkZXI6ICdjb2RlY29tbWl0JywgcmVwb3NpdG9yeU5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKSB9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gbm90IGEgVVJMIOKGkiB1bmtub3duXG4gIH1cbiAgcmV0dXJuIHsgcHJvdmlkZXI6ICd1bmtub3duJyB9O1xufVxuXG5sZXQgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IH0+IHwgdW5kZWZpbmVkO1xuaW50ZXJmYWNlIENvZGVDb21taXRNb2R1bGUge1xuICBDb2RlQ29tbWl0Q2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfTtcbiAgR2V0Q29tbWl0Q29tbWFuZDogbmV3IChpbnB1dDogeyByZXBvc2l0b3J5TmFtZTogc3RyaW5nOyBjb21taXRJZDogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZWNvbW1pdE1vZDogQ29kZUNvbW1pdE1vZHVsZSB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9PiB7XG4gIGlmICghY29kZWNvbW1pdE1vZCkgY29kZWNvbW1pdE1vZCA9IGF3YWl0IGxvYWRTZGs8Q29kZUNvbW1pdE1vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlY29tbWl0Jyk7XG4gIGlmICghY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbikgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IGNvZGVjb21taXRDbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gbmV3IGNvZGVjb21taXRNb2QuQ29kZUNvbW1pdENsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqIEZldGNoIChjYWNoZWQpIGEgc2luZ2xlIENvZGVDb21taXQgY29tbWl0J3MgZGF0ZSArIGZpcnN0IHBhcmVudHMgdmlhIEdldENvbW1pdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRNZXRhKHJlZ2lvbjogc3RyaW5nLCByZXBvc2l0b3J5TmFtZTogc3RyaW5nLCBjb21taXRJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGU/OiBzdHJpbmc7IHBhcmVudHM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNvbW1pdE1ldGFDYWNoZS5nZXQoY29tbWl0SWQpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBpZiAoIWNvZGVjb21taXRNb2QpIGNvZGVjb21taXRNb2QgPSBhd2FpdCBsb2FkU2RrPENvZGVDb21taXRNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdCcpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBjb2RlQ29tbWl0Q2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBjb2RlY29tbWl0TW9kLkdldENvbW1pdENvbW1hbmQoeyByZXBvc2l0b3J5TmFtZSwgY29tbWl0SWQgfSkpIGFzIHtcbiAgICBjb21taXQ/OiB7IGNvbW1pdHRlcj86IHsgZGF0ZT86IHN0cmluZyB9OyBhdXRob3I/OiB7IGRhdGU/OiBzdHJpbmcgfTsgcGFyZW50cz86IHN0cmluZ1tdIH07XG4gIH07XG4gIGNvbnN0IGNvbW1pdCA9IG91dC5jb21taXQ7XG4gIGNvbnN0IG1ldGEgPSB7IGRhdGU6IHRvSXNvKGNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGNvbW1pdD8uYXV0aG9yPy5kYXRlKSwgcGFyZW50czogY29tbWl0Py5wYXJlbnRzIH07XG4gIGNvbW1pdE1ldGFDYWNoZS5zZXQoY29tbWl0SWQsIG1ldGEpO1xuICByZXR1cm4gbWV0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvZGVDb21taXQocmVnaW9uOiBzdHJpbmcsIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYT86IHN0cmluZyk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBzaGE7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBvbGRlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRydW5jYXRlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBpZiAoIWN1cikgYnJlYWs7IC8vIHJlYWNoZWQgaGlzdG9yeSByb290IOKAlCB0aGUgd2hvbGUgcmFuZ2UgaXMgY292ZXJlZFxuICAgIGlmIChzaW5jZVNoYSAmJiBjdXIgPT09IHNpbmNlU2hhKSBicmVhazsgLy8gcmVhY2hlZCB0aGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kXG4gICAgaWYgKGkgPj0gTUFYX0NPTU1JVF9XQUxLKSB7IHRydW5jYXRlZCA9IHRydWU7IGJyZWFrOyB9IC8vIGhpdCB0aGUgY2FwIGJlZm9yZSB0aGUgYm91bmRhcnlcbiAgICBjb25zdCBtZXRhID0gYXdhaXQgY29kZUNvbW1pdE1ldGEocmVnaW9uLCByZXBvc2l0b3J5TmFtZSwgY3VyKTtcbiAgICBpZiAoIW1ldGE/LmRhdGUpIGJyZWFrO1xuICAgIGNvdW50Kys7XG4gICAgb2xkZXN0ID0gbWV0YS5kYXRlO1xuICAgIGlmICghc2luY2VTaGEpIGJyZWFrOyAvLyBubyByYW5nZSDihpIgc2luZ2xlIGNvbW1pdFxuICAgIGN1ciA9IG1ldGEucGFyZW50cz8uWzBdO1xuICB9XG4gIC8vIEEgdHJ1bmNhdGVkIHdhbGsgeWllbGRzIGEgY29tbWl0IE5FV0VSIHRoYW4gdGhlIHRydWUgb2xkZXN0LXVuc2hpcHBlZCBjb21taXQsXG4gIC8vIHdoaWNoIHdvdWxkIFVOREVSU1RBVEUgbGVhZCB0aW1lIOKAlCBvbWl0IHRoZSBmaWVsZHMgZW50aXJlbHkgcmF0aGVyIHRoYW4gcmVwb3J0IGFcbiAgLy8gd3JvbmcgKHRvby1zbWFsbCkgdmFsdWUuIFJlcG9ydGluZyBmYWxscyBiYWNrIHRvIGB1bmtub3duYC5cbiAgaWYgKHRydW5jYXRlZCkgcmV0dXJuIHt9O1xuICByZXR1cm4gb2xkZXN0ID8geyBjb21taXRUaW1lc3RhbXA6IG9sZGVzdCwgY29tbWl0Q291bnQ6IGNvdW50IH0gOiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUdpdEh1Yihvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmdJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEdpdEh1YlRva2VuKG9yZ0lkKTtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsXG4gICAgJ1VzZXItQWdlbnQnOiAncGlwZWxpbmUtYnVpbGRlci1mb3J3YXJkZXInLFxuICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgfTtcbiAgaWYgKHRva2VuKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgY29uc3QgcmF0ZUxpbWl0ZWQgPSAocjogUmVzcG9uc2UpID0+IHIuc3RhdHVzID09PSA0MDMgfHwgci5zdGF0dXMgPT09IDQyOTtcblxuICBpZiAoc2luY2VTaGEpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbXBhcmUvJHtzaW5jZVNoYX0uLi4ke3NoYX1gLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKHJhdGVMaW1pdGVkKHIpKSB7IHNjbUNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgU0NNX0NPT0xET1dOX01TOyByZXR1cm4ge307IH1cbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgaiA9IGF3YWl0IHIuanNvbigpIGFzIHsgY29tbWl0cz86IEFycmF5PHsgY29tbWl0PzogeyBjb21taXR0ZXI/OiB7IGRhdGU/OiBzdHJpbmcgfTsgYXV0aG9yPzogeyBkYXRlPzogc3RyaW5nIH0gfSB9PiB9O1xuICAgICAgY29uc3QgY29tbWl0cyA9IEFycmF5LmlzQXJyYXkoai5jb21taXRzKSA/IGouY29tbWl0cyA6IFtdO1xuICAgICAgaWYgKGNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0b0lzbyhjb21taXRzWzBdPy5jb21taXQ/LmNvbW1pdHRlcj8uZGF0ZSA/PyBjb21taXRzWzBdPy5jb21taXQ/LmF1dGhvcj8uZGF0ZSk7XG4gICAgICAgIGlmIChvbGRlc3QpIHJldHVybiB7IGNvbW1pdFRpbWVzdGFtcDogb2xkZXN0LCBjb21taXRDb3VudDogY29tbWl0cy5sZW5ndGggfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHNpbmdsZS1jb21taXQgcmVzb2x1dGlvblxuICB9XG4gIGNvbnN0IHIyID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbW1pdHMvJHtzaGF9YCwgeyBoZWFkZXJzIH0pO1xuICBpZiAocmF0ZUxpbWl0ZWQocjIpKSB7IHNjbUNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgU0NNX0NPT0xET1dOX01TOyByZXR1cm4ge307IH1cbiAgaWYgKHIyLm9rKSB7XG4gICAgY29uc3QgaiA9IGF3YWl0IHIyLmpzb24oKSBhcyB7IGNvbW1pdD86IHsgY29tbWl0dGVyPzogeyBkYXRlPzogc3RyaW5nIH07IGF1dGhvcj86IHsgZGF0ZT86IHN0cmluZyB9IH0gfTtcbiAgICBjb25zdCBkID0gdG9Jc28oai5jb21taXQ/LmNvbW1pdHRlcj8uZGF0ZSA/PyBqLmNvbW1pdD8uYXV0aG9yPy5kYXRlKTtcbiAgICBpZiAoZCkgcmV0dXJuIHsgY29tbWl0VGltZXN0YW1wOiBkLCBjb21taXRDb3VudDogMSB9O1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJpdGJ1Y2tldChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIHNoYTogc3RyaW5nKTogUHJvbWlzZTxDb21taXRJbmZvPiB7XG4gIGNvbnN0IHIgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGBodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJHtvd25lcn0vJHtyZXBvfS9jb21taXQvJHtzaGF9YCwge1xuICAgIGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiAncGlwZWxpbmUtYnVpbGRlci1mb3J3YXJkZXInLCAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gIH0pO1xuICBpZiAoci5zdGF0dXMgPT09IDQyOSkgeyBzY21Db29sZG93blVudGlsID0gRGF0ZS5ub3coKSArIFNDTV9DT09MRE9XTl9NUzsgcmV0dXJuIHt9OyB9XG4gIGlmIChyLm9rKSB7XG4gICAgY29uc3QgaiA9IGF3YWl0IHIuanNvbigpIGFzIHsgZGF0ZT86IHN0cmluZyB9O1xuICAgIGNvbnN0IGQgPSB0b0lzbyhqLmRhdGUpO1xuICAgIGlmIChkKSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IGQsIGNvbW1pdENvdW50OiAxIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYGNvbW1pdFRpbWVzdGFtcGAgKyBgY29tbWl0Q291bnRgIGZvciBhIHNvdXJjZS9kZXBsb3kgZXZlbnQsIGluLWFjY291bnQsXG4gKiBiZXN0LWVmZm9ydC4gQ29tcHV0ZWQgb25jZSBwZXIgKHBpcGVsaW5lSWQsIHNoYSk7IGFkdmFuY2VzIHRoZSBwaXBlbGluZSdzIHJhbmdlXG4gKiBib3VuZGFyeSBvbmx5IG9uIHN1Y2Nlc3MuIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7fSBvbiBhbnkgZmFpbHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbW1pdEluZm8ocGlwZWxpbmVJZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nIHwgbnVsbCwgcmVnaW9uOiBzdHJpbmcsIHNyYzogU291cmNlUmVmKTogUHJvbWlzZTxDb21taXRJbmZvPiB7XG4gIGlmIChzcmMucHJvdmlkZXIgPT09ICd1bmtub3duJykgcmV0dXJuIHt9O1xuICBjb25zdCBya2V5ID0gYCR7cGlwZWxpbmVJZH18JHtzcmMuc2hhfWA7XG4gIGNvbnN0IGNhY2hlZCA9IGNvbW1pdFJlc3VsdENhY2hlLmdldChya2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwcmV2ID0gbGFzdFNoYUJ5UGlwZWxpbmUuZ2V0KHBpcGVsaW5lSWQpO1xuICBjb25zdCBzaW5jZVNoYSA9IHByZXYgJiYgcHJldiAhPT0gc3JjLnNoYSA/IHByZXYgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGluZm86IENvbW1pdEluZm8gPSB7fTtcbiAgdHJ5IHtcbiAgICBpZiAoc3JjLnByb3ZpZGVyID09PSAnY29kZWNvbW1pdCcgJiYgc3JjLnJlcG9zaXRvcnlOYW1lKSB7XG4gICAgICBpbmZvID0gYXdhaXQgcmVzb2x2ZUNvZGVDb21taXQocmVnaW9uLCBzcmMucmVwb3NpdG9yeU5hbWUsIHNyYy5zaGEsIHNpbmNlU2hhKTtcbiAgICB9IGVsc2UgaWYgKHNyYy5wcm92aWRlciA9PT0gJ2dpdGh1YicgJiYgc3JjLm93bmVyICYmIHNyYy5yZXBvKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBzY21Db29sZG93blVudGlsKSBpbmZvID0gYXdhaXQgcmVzb2x2ZUdpdEh1YihzcmMub3duZXIsIHNyYy5yZXBvLCBzcmMuc2hhLCBzaW5jZVNoYSwgb3JnSWQpO1xuICAgIH0gZWxzZSBpZiAoc3JjLnByb3ZpZGVyID09PSAnYml0YnVja2V0JyAmJiBzcmMub3duZXIgJiYgc3JjLnJlcG8pIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IHNjbUNvb2xkb3duVW50aWwpIGluZm8gPSBhd2FpdCByZXNvbHZlQml0YnVja2V0KHNyYy5vd25lciwgc3JjLnJlcG8sIHNyYy5zaGEpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0NvbW1pdCByZXNvbHV0aW9uIGZhaWxlZCAob21pdHRpbmcgY29tbWl0VGltZXN0YW1wL2NvbW1pdENvdW50KScsIHsgcHJvdmlkZXI6IHNyYy5wcm92aWRlciwgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgIGluZm8gPSB7fTtcbiAgfVxuXG4gIGNvbW1pdFJlc3VsdENhY2hlLnNldChya2V5LCBpbmZvKTtcbiAgaWYgKGluZm8uY29tbWl0VGltZXN0YW1wKSBsYXN0U2hhQnlQaXBlbGluZS5zZXQocGlwZWxpbmVJZCwgc3JjLnNoYSk7XG4gIHJldHVybiBpbmZvO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudCAoUGhhc2UgNCkuIFVuZGVmaW5lZCB3aGVuIHVucmVzb2x2YWJsZS4gKi9cbiAgY29tbWl0VGltZXN0YW1wPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIHJlc29sdmVkIHJhbmdlICjiiaUxKS4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRDb3VudD86IG51bWJlcjtcbiAgLyoqIERlcGxveSBlbnZpcm9ubWVudCDigJQgc2V0IG9ubHkgd2hlbiB0aGUgZXZlbnQncyBzdGFnZSBpcyBsaXN0ZWQgaW4gdGhlXG4gICAqICBwaXBlbGluZSdzIGBwYi5kZXBsb3lzYCB0YWcuIFVuZGVmaW5lZCBvdGhlcndpc2UgKOKHkiBub3QgYSBkZXBsb3kpLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbi8qKiBGaXJzdCBub24tZW1wdHkgc3RyaW5nIGFtb25nIHRoZSBjYW5kaWRhdGVzLCBjYXBwZWQgdG8gdGhlIGluZ2VzdCBtYXguICovXG5mdW5jdGlvbiBmaXJzdEF0dHIoLi4udmFsczogdW5rbm93bltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2IG9mIHZhbHMpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCkgcmV0dXJuIHYuc2xpY2UoMCwgTUFYX0FUVFIpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZXh0cmFjdGlvbiBvZiB0aGUgc291cmNlIGNvbW1pdCBpZCArIHJlZiAoYW5kIHRoZSByZXZpc2lvbiBVUkwsIHVzZWRcbiAqIG9ubHkgaW4tYWNjb3VudCB0byBjbGFzc2lmeSB0aGUgc291cmNlIHR5cGUgZm9yIGNvbW1pdC1yYW5nZSByZXNvbHV0aW9uKSBmcm9tIGFcbiAqIENvZGVQaXBlbGluZSBldmVudCBkZXRhaWwuIENvZGVQaXBlbGluZSBzdXJmYWNlcyB0aGUgc291cmNlIHJldmlzaW9uIHVuZGVyIGEgZmV3XG4gKiBzaGFwZXMgZGVwZW5kaW5nIG9uIHRoZSBldmVudCB0eXBlIC8gc291cmNlLWFjdGlvbjsgd2UgY2hlY2sgdGhlIGtub3duIG9uZXMgYW5kXG4gKiBsZWF2ZSB0aGUgZmllbGRzIHVuZGVmaW5lZCB3aGVuIG5vbmUgYXJlIHByZXNlbnQgKE5VTEwgZG93bnN0cmVhbSkuIE5ldmVyIHB1bGxzIGFuXG4gKiBBUk4vYWNjb3VudCBpZDogb25seSByZXZpc2lvbi9icmFuY2gvdXJsIHN0cmluZyBmaWVsZHMgYXJlIHJlYWQ7IHRoZSByZXZpc2lvblVybFxuICogaXMgY29uc3VtZWQgaW4tYWNjb3VudCAoc291cmNlIGNsYXNzaWZpY2F0aW9uKSBhbmQgbmV2ZXIgZm9yd2FyZGVkIG9uIGl0cyBvd24uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb21taXQoZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHsgY29tbWl0U2hhPzogc3RyaW5nOyBjb21taXRSZWY/OiBzdHJpbmc7IHJldmlzaW9uVXJsPzogc3RyaW5nIH0ge1xuICAvLyBgc291cmNlLXJldmlzaW9uc2AgKGtlYmFiLCBFdmVudEJyaWRnZSkgLyBgc291cmNlUmV2aXNpb25zYCAoY2FtZWwpIOKAlCBmaXJzdCBlbnRyeS5cbiAgY29uc3QgcmV2cyA9IChkZXRhaWxbJ3NvdXJjZS1yZXZpc2lvbnMnXSA/PyBkZXRhaWwuc291cmNlUmV2aXNpb25zKSBhc1xuICAgIHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdFJldiA9IEFycmF5LmlzQXJyYXkocmV2cykgPyByZXZzWzBdIDogdW5kZWZpbmVkO1xuICAvLyBPbiBzb3VyY2UgYWN0aW9ucyB0aGUgcmV2aXNpb24gaWQgY2FuIGFsc28gcmlkZSBvbiBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBjb21taXRTaGEgPSBmaXJzdEF0dHIoXG4gICAgZGV0YWlsLmNvbW1pdElkLFxuICAgIGRldGFpbC5yZXZpc2lvbklkLFxuICAgIGZpcnN0UmV2Py5yZXZpc2lvbklkLFxuICAgIGV4ZWNSZXN1bHQ/LnJldmlzaW9uSWQsXG4gICk7XG4gIGNvbnN0IGNvbW1pdFJlZiA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0UmVmLFxuICAgIGRldGFpbC5icmFuY2gsXG4gICAgZGV0YWlsLnNvdXJjZUJyYW5jaCxcbiAgICBmaXJzdFJldj8uYnJhbmNoTmFtZSxcbiAgICBmaXJzdFJldj8uYnJhbmNoLFxuICApO1xuICBjb25zdCByZXZpc2lvblVybCA9IHR5cGVvZiBmaXJzdFJldj8ucmV2aXNpb25VcmwgPT09ICdzdHJpbmcnID8gZmlyc3RSZXYucmV2aXNpb25VcmwgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgLi4uKGNvbW1pdFNoYSAmJiB7IGNvbW1pdFNoYSB9KSwgLi4uKGNvbW1pdFJlZiAmJiB7IGNvbW1pdFJlZiB9KSwgLi4uKHJldmlzaW9uVXJsICYmIHsgcmV2aXNpb25VcmwgfSkgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnlFdmVudChkZXRhaWxUeXBlOiBzdHJpbmcpOiB7IGV2ZW50VHlwZTogc3RyaW5nOyBldmVudFNvdXJjZTogc3RyaW5nIH0ge1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnUGlwZWxpbmUgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdTdGFnZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnU1RBR0UnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0FjdGlvbiBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQUNUSU9OJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIC8vIENvZGVCdWlsZCBcIkJ1aWxkIFN0YXRlXCIgZXZlbnRzIGlkZW50aWZ5IGEgYnVpbGQgKnByb2plY3QqLCBub3QgYSBwaXBlbGluZSwgc29cbiAgLy8gcGFyc2VSZWNvcmQgZHJvcHMgdGhlbSBvbiB0aGUgYGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJ2AgY2hlY2sgYmVsb3cg4oCUXG4gIC8vIHRoZSAnQlVJTEQnIGV2ZW50VHlwZSBpcyBuZXZlciBwZXJzaXN0ZWQgaGVyZSAocGx1Z2luIEJVSUxEIGV2ZW50cyBhcmVcbiAgLy8gcmVjb3JkZWQgZGlyZWN0bHkgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlKS4gVGhlICdjb2RlYnVpbGQnIHNvdXJjZSBpcyB3aGF0XG4gIC8vIHJvdXRlcyB0aGUgZHJvcDsga2VlcCB0aGlzIGJyYW5jaCBvbmx5IGZvciB0aGF0LlxuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgcGlwZWxpbmUgaWQsIHNvIHNraXAgdGhlbS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgcGIucGlwZWxpbmUtaWQgKD0gcGxhdGZvcm0gcGlwZWxpbmVJZCkgKyBwYi5kZXBsb3lzIG1hcC5cbiAgLy8gVGhlIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMgfSA9IGF3YWl0IHJlc29sdmVQaXBlbGluZShhcm4sIGV2ZW50LnJlZ2lvbik7XG4gIGlmICghcGlwZWxpbmVJZCkgcmV0dXJuIG51bGw7IC8vIHVudGFnZ2VkIC8gdW5yZWdpc3RlcmVkIOKGkiBza2lwXG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gKGRldGFpbFsnc3RhcnQtdGltZSddIGFzIHN0cmluZykgfHwgZXZlbnQudGltZTtcbiAgY29uc3Qgc3RhdGUgPSBkZXRhaWwuc3RhdGUgYXMgc3RyaW5nO1xuXG4gIGxldCBkdXJhdGlvbk1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChbJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCddLmluY2x1ZGVzKHN0YXRlKSkge1xuICAgIGNvbXBsZXRlZEF0ID0gZXZlbnQudGltZTtcbiAgICBpZiAoc3RhcnRlZEF0ICYmIGNvbXBsZXRlZEF0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzdGFydGVkQXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmFpbHVyZSByZWFzb24gdG8gYSB0eXBlZCBmaWVsZC4gT24gQWN0aW9uIGV2ZW50cyBBV1MgcHV0cyB0aGVcbiAgLy8gaHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoYW5kIGEgbG9nIFVSTCArIGVycm9yLWNvZGUsIHdoaWNoIHN0YXkgaW4gYGRldGFpbGApXG4gIC8vIHVuZGVyIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdW1tYXJ5ID0gcmVzdWx0Py5bJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5J107XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHR5cGVvZiBzdW1tYXJ5ID09PSAnc3RyaW5nJyAmJiBzdW1tYXJ5Lmxlbmd0aCA+IDBcbiAgICA/IHN1bW1hcnkuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gRE9SQSBkZXBsb3kgYXR0cmlidXRpb24g4oCUIGFsbCBvcHRpb25hbDogb21pdHRlZCAodW5kZWZpbmVkKSB3aGVuIHRoZVxuICAvLyBldmVudC9waXBlbGluZSBkb2Vzbid0IGNhcnJ5IHRoZW0uXG4gIGNvbnN0IHsgY29tbWl0U2hhLCBjb21taXRSZWYsIHJldmlzaW9uVXJsIH0gPSBleHRyYWN0Q29tbWl0KGRldGFpbCk7XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1pZCddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhZ2VOYW1lID0gZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEVudmlyb25tZW50ICjih5IgaXNEZXBsb3kpIGlzIHNldCBPTkxZIHdoZW4gdGhpcyBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgLy8gcGlwZWxpbmUncyBwYi5kZXBsb3lzIHRhZy4gUElQRUxJTkUgZXZlbnRzIGhhdmUgbm8gc3RhZ2Ug4oaSIG5ldmVyIGEgZGVwbG95LlxuICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWdlTmFtZSA/IGRlcGxveXMuZ2V0KHN0YWdlTmFtZSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gUGhhc2UgNCDigJQgcmVzb2x2ZSB0aGUgY29tbWl0IHJhbmdlIChvbGRlc3QtdW5zaGlwcGVkIHRpbWVzdGFtcCArIGNvdW50KSBmb3IgYW55XG4gIC8vIGV2ZW50IGNhcnJ5aW5nIGEgY29tbWl0LiBCZXN0LWVmZm9ydC9pbi1hY2NvdW50OyBvbWl0dGVkIG9uIGFueSBmYWlsdXJlLlxuICAvLyBHQVRFRCBvbiBgRE9SQV9FTkFCTEVEYCAoc2V0IGJ5IGBzZXR1cC1ldmVudHMgLS13aXRoLWRvcmFgKTogRE9SQSBsZWFkIHRpbWUgaXMgYW5cbiAgLy8gYWR2YW5jZWRfcmVwb3J0aW5nIGFkZC1vbiwgc28gb3JncyB3aXRob3V0IGl0IHNraXAgdGhlIFNDTS9zZWNyZXQgY29zdCBlbnRpcmVseSDigJRcbiAgLy8gc3RhbmRhcmQgcmVwb3J0aW5nIChjb21taXRTaGEgKyBhbGwgb3RoZXIgZmllbGRzKSBzdGlsbCBmb3J3YXJkcyByZWdhcmRsZXNzLlxuICBsZXQgY29tbWl0VGltZXN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21taXRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoY29tbWl0U2hhICYmIHByb2Nlc3MuZW52LkRPUkFfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gICAgY29uc3Qgc3JjID0gY2xhc3NpZnlTb3VyY2UocmV2aXNpb25VcmwpO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlQ29tbWl0SW5mbyhwaXBlbGluZUlkLCBvcmdJZCwgZXZlbnQucmVnaW9uLCB7IHNoYTogY29tbWl0U2hhLCAuLi5zcmMgfSk7XG4gICAgY29tbWl0VGltZXN0YW1wID0gaW5mby5jb21taXRUaW1lc3RhbXA7XG4gICAgY29tbWl0Q291bnQgPSBpbmZvLmNvbW1pdENvdW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvcmdJZCxcbiAgICBwaXBlbGluZUlkLFxuICAgIGV2ZW50U291cmNlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBzdGF0dXM6IHN0YXRlLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIHN0YWdlTmFtZSxcbiAgICBhY3Rpb25OYW1lLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLFxuICAgIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksXG4gICAgLi4uKGNvbW1pdFRpbWVzdGFtcCAmJiB7IGNvbW1pdFRpbWVzdGFtcCB9KSxcbiAgICAuLi4oY29tbWl0Q291bnQgJiYgeyBjb21taXRDb3VudCB9KSxcbiAgICAuLi4oZW52aXJvbm1lbnQgJiYgeyBlbnZpcm9ubWVudCB9KSxcbiAgICBkZXRhaWwsXG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBQaGFzZSAzOiBkZWxpdmVyeSBoZWFsdGggKyBzZWxmLWhlYWxpbmcgRExRIHJlZHJpdmUg4pSAXG4vLyBBZnRlciBhIFNVQ0NFU1NGVUwgYmF0Y2ggUE9TVCB3ZSAodGhyb3R0bGVkLCBiZXN0LWVmZm9ydCk6XG4vLyAgIDEuIFBPU1QgYW4gaW5nZXN0LWhlYWx0aCBzaWduYWwgdG8gL2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGggc28gdGhlIFJlcG9ydHMgVUlcbi8vICAgICAgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuXG4vLyAgIDIuIElmIHRoZSBETFEgaXMgbm9uLWVtcHR5LCBubyBtb3ZlIHRhc2sgaXMgYWxyZWFkeSBydW5uaW5nLCBBTkQgdGhlIG9sZGVzdCBETFFcbi8vICAgICAgbWVzc2FnZSBpcyB5b3VuZ2VyIHRoYW4gdGhlIHBvaXNvbi1hZ2UgY2VpbGluZywga2ljayBvZmYgYW4gU1FTXG4vLyAgICAgIE1lc3NhZ2VNb3ZlVGFzayAoRExRIOKGkiBtYWluIHF1ZXVlKSBzbyByZXRyeWFibGUgZmFpbHVyZXMgc2VsZi1oZWFsIHdpdGhvdXQgYVxuLy8gICAgICBuZXcgQVdTIHNlcnZpY2UuIFRoZSByZXBvcnRpbmcgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcyBhbnlcbi8vICAgICAgcmVkZWxpdmVyZWQgZXZlbnQsIHNvIGEgcmVkcml2ZSBjYW4ndCBkb3VibGUtY291bnQuXG4vLyBHdWFyZHM6IG9ubHkgb24gc3VjY2Vzcywgb25lLWF0LWEtdGltZSAoTGlzdE1lc3NhZ2VNb3ZlVGFza3MpLCBhIHBvaXNvbi1hZ2UgY2VpbGluZ1xuLy8gKHNvIGEgbWVzc2FnZSB0aGF0IGFsd2F5cyBmYWlscyBjYW4ndCBsb29wIERMUeKGkm1haW7ihpJETFEgZm9yZXZlciksIGFuZCB0aHJvdHRsZWQgdmlhXG4vLyBtb2R1bGUgdGltZXN0YW1wcy4gTkVWRVIgdGhyb3dzIOKAlCBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBiYXRjaC5cbi8vXG4vLyBJQU0gcmVxdWlyZWQgKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIHNxczpHZXRRdWV1ZUF0dHJpYnV0ZXMsIHNxczpMaXN0TWVzc2FnZU1vdmVUYXNrcywgc3FzOlN0YXJ0TWVzc2FnZU1vdmVUYXNrIChvbiB0aGUgRExRKVxuXG5pbnRlcmZhY2UgU3FzQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIFNxc01vZHVsZSB7XG4gIFNRU0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU3FzQ2xpZW50TGlrZTtcbiAgR2V0UXVldWVBdHRyaWJ1dGVzQ29tbWFuZDogbmV3IChpbnB1dDogeyBRdWV1ZVVybDogc3RyaW5nOyBBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gfSkgPT4gdW5rbm93bjtcbiAgTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZDogbmV3IChpbnB1dDogeyBTb3VyY2VBcm46IHN0cmluZzsgRGVzdGluYXRpb25Bcm4/OiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBzcXNNb2Q6IFNxc01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBzcXNDbGllbnRzQnlSZWdpb246IE1hcDxzdHJpbmcsIFNxc0NsaWVudExpa2U+IHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gc3FzQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxTcXNDbGllbnRMaWtlPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgaWYgKCFzcXNDbGllbnRzQnlSZWdpb24pIHNxc0NsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IHNxc0NsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBuZXcgc3FzTW9kLlNRU0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBzcXNDbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vLyBEZWxpdmVyeS1oZWFsdGggY291bnRlcnMgYXJlIGF0dHJpYnV0ZWQgUEVSIFJFU09MVkVEIE9SRyAodGhlIGZvcndhcmRlciBpcyBhIGZsZWV0XG4vLyBMYW1iZGEgc2VydmluZyBtYW55IG9yZ3M7IGEgc2luZ2xlIGdsb2JhbCBjb3VudGVyIHdvdWxkIG1pcy1hdHRyaWJ1dGUgb25lIG9yZydzXG4vLyB0aHJvdWdocHV0IHRvIGFub3RoZXIpLiBLZXllZCBieSBvcmdJZCAoJycgYnVja2V0ID0gcGlwZWxpbmUgd2l0aCBubyBPcmdJZCB0YWcpLlxuLy8gVGhlIERMUSBkZXB0aCAoYGRyb3BwZWRgKSBpcyBnZW51aW5lbHkgZmxlZXQtZ2xvYmFsIOKAlCBvbmUgc2hhcmVkIERMUSDigJQgc28gaXQgaXMgYVxuLy8gc2luZ2xlIHNuYXBzaG90IHBvc3RlZCBhbG9uZ3NpZGUgZWFjaCBvcmcncyBoZWFsdGgsIGRvY3VtZW50ZWQgYXMgdGhlIHNoYXJlZCBkZXB0aC5cbmNvbnN0IGZvcndhcmRlZEJ5T3JnID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbmNvbnN0IGxhc3RFdmVudEF0QnlPcmcgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xubGV0IGxhc3RIZWFsdGhBdCA9IDA7XG5sZXQgbGFzdFJlZHJpdmVBdCA9IDA7XG5jb25zdCBIRUFMVEhfVEhST1RUTEVfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBSRURSSVZFX1RIUk9UVExFX01TID0gNSAqIDYwICogMTAwMDtcbi8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IGlmIHRoZSBvbGRlc3QgRExRIG1lc3NhZ2UgaXMgb2xkZXIgdGhhbiB0aGlzLCB3ZSBTVE9QXG4vLyByZWRyaXZpbmcgaXQgKERMUeKGkm1haW7ihpJmYWls4oaSRExRIHdvdWxkIGxvb3AgZm9yZXZlcikuIFN1Y2ggbWVzc2FnZXMgYXJlIGxlZnQgZm9yIGFuXG4vLyBhbGFybSAvIG1hbnVhbCBpbnNwZWN0aW9uIGluc3RlYWQgb2YgY2h1cm5pbmcgdGhlIGZsZWV0IGluZGVmaW5pdGVseS5cbmNvbnN0IE1BWF9ETFFfUkVEUklWRV9BR0VfU0VDID0gNiAqIDYwICogNjA7IC8vIDYgaG91cnNcblxuLyoqIFBhcnNlIHRoZSBTUVMgdHJpZ2dlciBBUk4gYW5kIGRlcml2ZSB0aGUgbWFpbiArIERMUSBBUk5zIGFuZCB0aGUgRExRIFVSTC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcmVnaW9uOiBzdHJpbmc7IG1haW5Bcm46IHN0cmluZzsgZGxxQXJuOiBzdHJpbmc7IGRscVVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIW1haW5RdWV1ZUFybikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYXJuOmF3czpzcXM6e3JlZ2lvbn06e2FjY291bnR9OntuYW1lfVxuICBjb25zdCBwYXJ0cyA9IG1haW5RdWV1ZUFybi5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgNiB8fCBwYXJ0c1syXSAhPT0gJ3NxcycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFssICwgLCByZWdpb24sIGFjY291bnQsIG5hbWVdID0gcGFydHM7XG4gIGNvbnN0IGRscUFybiA9IHByb2Nlc3MuZW52LkVWRU5UX0RMUV9BUk4gfHwgYGFybjphd3M6c3FzOiR7cmVnaW9ufToke2FjY291bnR9OiR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxTmFtZSA9IGRscUFybi5zcGxpdCgnOicpLnBvcCgpID8/IGAke25hbWV9LWRscWA7XG4gIGNvbnN0IGRscVVybCA9IGBodHRwczovL3Nxcy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2FjY291bnR9LyR7ZGxxTmFtZX1gO1xuICByZXR1cm4geyByZWdpb24sIG1haW5Bcm46IG1haW5RdWV1ZUFybiwgZGxxQXJuLCBkbHFVcmwgfTtcbn1cblxuLyoqIFNuYXBzaG90IHRoZSBETFEgZGVwdGggKyB0aGUgYWdlIChzZWNvbmRzKSBvZiBpdHMgb2xkZXN0IG1lc3NhZ2UgKGZvciB0aGVcbiAqICBwb2lzb24tbWVzc2FnZSByZWRyaXZlIGNlaWxpbmcpLiBNaXNzaW5nL05hTiBhdHRyaWJ1dGVzIGZhbGwgYmFjayB0byAwLiAqL1xuYXN5bmMgZnVuY3Rpb24gZGxxU3RhdHMocmVnaW9uOiBzdHJpbmcsIGRscVVybDogc3RyaW5nKTogUHJvbWlzZTx7IGRlcHRoOiBudW1iZXI7IG9sZGVzdEFnZVNlYzogbnVtYmVyIH0+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5HZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kKHtcbiAgICBRdWV1ZVVybDogZGxxVXJsLFxuICAgIEF0dHJpYnV0ZU5hbWVzOiBbJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcycsICdBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSddLFxuICB9KSkgYXMgeyBBdHRyaWJ1dGVzPzogeyBBcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXM/OiBzdHJpbmc7IEFwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlPzogc3RyaW5nIH0gfTtcbiAgY29uc3QgbiA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzID8/ICcwJyk7XG4gIGNvbnN0IGFnZSA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2UgPz8gJzAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXB0aDogTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDAsXG4gICAgb2xkZXN0QWdlU2VjOiBOdW1iZXIuaXNGaW5pdGUoYWdlKSA/IGFnZSA6IDAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FjdGl2ZU1vdmVUYXNrKHJlZ2lvbjogc3RyaW5nLCBkbHFBcm46IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkxpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuIH0pKSBhcyB7XG4gICAgUmVzdWx0cz86IEFycmF5PHsgU3RhdHVzPzogc3RyaW5nIH0+O1xuICB9O1xuICByZXR1cm4gKG91dC5SZXN1bHRzID8/IFtdKS5zb21lKHQgPT4gdC5TdGF0dXMgPT09ICdSVU5OSU5HJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nLCBtYWluQXJuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5TdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiwgRGVzdGluYXRpb25Bcm46IG1haW5Bcm4gfSkpO1xufVxuXG4vKiogUE9TVCBvbmUgb3JnJ3MgaW5nZXN0LWhlYWx0aCBzaWduYWwuIFJldHVybnMgdHJ1ZSBvbmx5IG9uIGEgY29uZmlybWVkIDJ4eCBzbyB0aGVcbiAqICBjYWxsZXIgcmVzZXRzIHRoYXQgb3JnJ3MgYGZvcndhcmRlZGAgY291bnRlciBPTkxZIHdoZW4gdGhlIHNpZ25hbCB3YXMgYWNjZXB0ZWRcbiAqICAoYSBkcm9wcGVkL2ZhaWxlZCBQT1NUIG11c3Qgbm90IHNpbGVudGx5IHplcm8gdGhlIGFjY3VtdWxhdGVkIGNvdW50KS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybDogc3RyaW5nLCBib2R5OiB7IG9yZ0lkPzogc3RyaW5nOyBmb3J3YXJkZWQ6IG51bWJlcjsgZHJvcHBlZDogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9hcGkvcmVwb3J0cy9pbmdlc3QtaGVhbHRoYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBsb2cud2FybignaW5nZXN0LWhlYWx0aCBQT1NUIHJldHVybmVkIG5vbi0yeHggKGlnbm9yZWQpJywgeyBzdGF0dXM6IHJlcy5zdGF0dXMsIG9yZ0lkOiBib2R5Lm9yZ0lkIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ2luZ2VzdC1oZWFsdGggUE9TVCBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogU3RyaW5nKGVyciksIG9yZ0lkOiBib2R5Lm9yZ0lkIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm90dGxlZCwgYmVzdC1lZmZvcnQgcG9zdC1zdWNjZXNzIHdvcms6IGVtaXQgcGVyLW9yZyBpbmdlc3QtaGVhbHRoIGFuZCBzZWxmLWhlYWxcbiAqIHRoZSBETFEuIE5ldmVyIHRocm93cy4gYGZvcndhcmRlZGAvYGxhc3RFdmVudEF0YCBhY2N1bXVsYXRlIFBFUiBPUkcgYWNyb3NzIGJhdGNoZXNcbiAqIGJldHdlZW4gaGVhbHRoIHBvc3RzOyBgZHJvcHBlZGAgaXMgdGhlIHNoYXJlZCBmbGVldCBETFEgZGVwdGggc25hcHNob3QuIEEgcGVyLW9yZ1xuICogY291bnRlciBpcyB6ZXJvZWQgb25seSBhZnRlciB0aGF0IG9yZydzIGhlYWx0aCBQT1NUIGlzIGNvbmZpcm1lZCAyeHguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdEhlYWx0aEF0IDwgSEVBTFRIX1RIUk9UVExFX01TKSByZXR1cm47XG4gIGxhc3RIZWFsdGhBdCA9IG5vdztcbiAgdHJ5IHtcbiAgICBjb25zdCBxID0gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybik7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgb2xkZXN0QWdlU2VjID0gMDtcbiAgICBpZiAocSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBkbHFTdGF0cyhxLnJlZ2lvbiwgcS5kbHFVcmwpO1xuICAgICAgICBkZXB0aCA9IHN0YXRzLmRlcHRoO1xuICAgICAgICBvbGRlc3RBZ2VTZWMgPSBzdGF0cy5vbGRlc3RBZ2VTZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBzdGF0cyBjaGVjayBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUG9zdCBvbmUgaGVhbHRoIHNpZ25hbCBwZXIgcmVzb2x2ZWQgb3JnLCBhdHRyaWJ1dGluZyBpdHMgb3duIGZvcndhcmRlZCBjb3VudCArXG4gICAgLy8gbGFzdCBldmVudCB0aW1lLiBgZHJvcHBlZGAgKHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoKSByaWRlcyBhbG9uZyBvbiBlYWNoLlxuICAgIC8vIFNuYXBzaG90IHRoZSBrZXlzIGZpcnN0IHNvIHdlIGRvbid0IG11dGF0ZSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZy5cbiAgICBjb25zdCBvcmdLZXlzID0gbmV3IFNldChbLi4uZm9yd2FyZGVkQnlPcmcua2V5cygpLCAuLi5sYXN0RXZlbnRBdEJ5T3JnLmtleXMoKV0pO1xuICAgIGlmIChvcmdLZXlzLnNpemUgPT09IDApIG9yZ0tleXMuYWRkKCcnKTsgLy8gbm90aGluZyBmb3J3YXJkZWQgeWV0IOKGkiBzdGlsbCByZXBvcnQgZGVwdGhcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmdLZXlzKSB7XG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwO1xuICAgICAgY29uc3QgbGFzdEV2ZW50QXQgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCBwb3N0SW5nZXN0SGVhbHRoKGJhc2VVcmwsIHtcbiAgICAgICAgLi4uKGtleSA/IHsgb3JnSWQ6IGtleSB9IDoge30pLFxuICAgICAgICBmb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGRlcHRoLFxuICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgIH0pO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYywgY2VpbGluZ1NlYzogTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhd2FpdCBoYXNBY3RpdmVNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4pKSkge1xuICAgICAgICAgICAgbGFzdFJlZHJpdmVBdCA9IG5vdztcbiAgICAgICAgICAgIGF3YWl0IHN0YXJ0TW92ZVRhc2socS5yZWdpb24sIHEuZGxxQXJuLCBxLm1haW5Bcm4pO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1N0YXJ0ZWQgc2VsZi1oZWFsaW5nIERMUeKGkm1haW4gcmVkcml2ZScsIHsgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKCdETFEgcmVkcml2ZSBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdoZWFsdGgvcmVkcml2ZSBzdGVwIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgKyBjb21taXQgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcFxuICAvLyBpbnRlbnRpb25hbCBza2lwcyAobnVsbCkuIEEgbWFsZm9ybWVkIHJlY29yZCBCT0RZIGlzIGhhbmRsZWQgaW5zaWRlIHBhcnNlUmVjb3JkXG4gIC8vIChsb2dnZWQgKyBza2lwcGVkKSBzbyBvbmUgYmFkIG1lc3NhZ2UgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2gg4oCUIHdoaWxlIGdlbnVpbmVcbiAgLy8gaW5mcmEgZXJyb3JzIChlLmcuIEFjY2Vzc0RlbmllZCBvbiB0aGUgdGFnIGxvb2t1cCkgc3RpbGwgcHJvcGFnYXRlIHNvIGEgbWlzc2luZ1xuICAvLyBJQU0gZ3JhbnQgc3VyZmFjZXMgYW5kIFNRUyByZXRyaWVzIHRoZSBiYXRjaC5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2UuIE9uIGEgNDAxLzQwMyB0aGUgY2FjaGVkIEpXVCBoYXMgbGlrZWx5XG4gIC8vIGV4cGlyZWQg4oCUIGRyb3AgaXQsIHJlLWZldGNoLCBhbmQgcmV0cnkgT05DRSBzbyBhbiBleHBpcmVkIHRva2VuIGRvZXNuJ3RcbiAgLy8gcGVybWFuZW50bHkgYnJpY2sgYSB3YXJtIGNvbnRhaW5lci4gYG9yZ0lkYCBpcyBJTlRFUk5BTCAodG9rZW4vaGVhbHRoIGtleWluZykg4oCUXG4gIC8vIHN0cmlwIGl0IGhlcmUgc28gaXQgbmV2ZXIgcmlkZXMgdGhlIHdpcmU7IHRoZSBpbmdlc3QgcmVzb2x2ZXMgb3JnIGZyb20gdGhlXG4gIC8vIHBpcGVsaW5lIHJlZ2lzdHJ5LCBub3QgdGhlIGJvZHkuXG4gIGNvbnN0IHBheWxvYWRFdmVudHMgPSBldmVudHMubWFwKCh7IG9yZ0lkOiBfb3JnSWQsIC4uLnJlc3QgfSkgPT4gcmVzdCk7XG4gIGNvbnN0IHBvc3QgPSAodG9rZW46IHN0cmluZykgPT4gZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXZlbnRzOiBwYXlsb2FkRXZlbnRzIH0pLFxuICB9KTtcbiAgbGV0IHJlcyA9IGF3YWl0IHBvc3QoYXdhaXQgZ2V0QXV0aFRva2VuKCkpO1xuICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgIGxvZy53YXJuKCdSZXBvcnRpbmcgQVBJIGF1dGggZmFpbGVkOyByZWZyZXNoaW5nIHRva2VuIGFuZCByZXRyeWluZyBvbmNlJywgeyBzdGF0dXM6IHJlcy5zdGF0dXMgfSk7XG4gICAgY2FjaGVkVG9rZW4gPSBudWxsO1xuICAgIHJlcyA9IGF3YWl0IHBvc3QoYXdhaXQgZ2V0QXV0aFRva2VuKCkpO1xuICB9XG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gICAgbG9nLmVycm9yKGBSZXBvcnRpbmcgQVBJIHJldHVybmVkICR7cmVzLnN0YXR1c31gLCB7IGJvZHkgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvcnRpbmcgQVBJIGZhaWxlZDogJHtyZXMuc3RhdHVzfWApO1xuICB9XG5cbiAgLy8gVGhlIGluc2VydCBhbHJlYWR5IHN1Y2NlZWRlZCAoMnh4KS4gVGhlIHBhcnNlZCBib2R5IGlzIG9ubHkgdXNlZCBmb3IgYSBsb2dcbiAgLy8gbGluZSwgc28gYSBub24tSlNPTi9lbXB0eSBib2R5IG11c3Qgbm90IHRocm93IGFuZCBmYWlsIHRoZSB3aG9sZSBiYXRjaCDigJRcbiAgLy8gdGhhdCB3b3VsZCB0cmlnZ2VyIGFuIFNRUyByZWRlbGl2ZXJ5IGFuZCByZS1QT1NUIChkdXBsaWNhdGUpIGFscmVhZHktaW5zZXJ0ZWRcbiAgLy8gZXZlbnRzLiBUaGUgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcywgYnV0IGF2b2lkIHRoZSBjaHVybiBhbnl3YXkuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xuXG4gIC8vIEFjY3VtdWxhdGUgZGVsaXZlcnktaGVhbHRoIGNvdW50ZXJzIFBFUiBSRVNPTFZFRCBPUkcsIHRoZW4gcnVuIHRoZSB0aHJvdHRsZWRcbiAgLy8gcG9zdC1zdWNjZXNzIGhlYWx0aCArIHNlbGYtaGVhbGluZyBETFEgcmVkcml2ZSAoYmVzdC1lZmZvcnQsIG5ldmVyIGZhaWxzIGJhdGNoKS5cbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGNvbnN0IGtleSA9IGUub3JnSWQgPz8gJyc7XG4gICAgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgKGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDApICsgMSk7XG4gICAgY29uc3QgYXQgPSBlLmNvbXBsZXRlZEF0IHx8IGUuc3RhcnRlZEF0O1xuICAgIGlmIChhdCkge1xuICAgICAgY29uc3QgcHJldiA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXYgfHwgYXQgPiBwcmV2KSBsYXN0RXZlbnRBdEJ5T3JnLnNldChrZXksIGF0KTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgcmVwb3J0SGVhbHRoQW5kUmVkcml2ZShiYXNlVXJsLCBldmVudC5SZWNvcmRzWzBdPy5ldmVudFNvdXJjZUFSTik7XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IHJlc2V0IGFsbCBtb2R1bGUtbGV2ZWwgY2FjaGVzL3Rocm90dGxlIHN0YXRlIHNvIHRlc3RzIGFyZVxuICogaXNvbGF0ZWQgZnJvbSBvbmUgYW5vdGhlci4gU3RyaXBwZWQgZnJvbSB0aGUgcHVibGlzaGVkIC5kLnRzIChzdHJpcEludGVybmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEZvclRlc3RzKCk6IHZvaWQge1xuICByZXNvbHZlZEJ5QXJuLmNsZWFyKCk7XG4gIGNvbW1pdFJlc3VsdENhY2hlLmNsZWFyKCk7XG4gIGxhc3RTaGFCeVBpcGVsaW5lLmNsZWFyKCk7XG4gIGNvbW1pdE1ldGFDYWNoZS5jbGVhcigpO1xuICBzY21Db29sZG93blVudGlsID0gMDtcbiAgZ2l0aHViVG9rZW5CeU9yZy5jbGVhcigpO1xuICBmb3J3YXJkZWRCeU9yZy5jbGVhcigpO1xuICBsYXN0RXZlbnRBdEJ5T3JnLmNsZWFyKCk7XG4gIGxhc3RIZWFsdGhBdCA9IDA7XG4gIGxhc3RSZWRyaXZlQXQgPSAwO1xuICBjYWNoZWRUb2tlbiA9IG51bGw7XG59XG4iXX0=
|
|
968
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWtCOUYsSUFBSSxlQUErQyxDQUFDO0FBQ3BELEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsSUFBSSxDQUFDLGVBQWU7UUFBRSxlQUFlLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFrQyxDQUFDO0lBQ3hILE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSxLQUFLLFVBQVUsT0FBTyxDQUFJLEdBQVc7SUFDbkMsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxNQUFNLEdBQUcsR0FBRztJQUNWLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFB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QUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTSU5HTEUtRklMRSBCWSBERVBMT1lNRU5UIENPTlNUUkFJTlQg4oCUIGRvIG5vdCBzcGxpdCB0aGlzIG1vZHVsZS5cbiAqXG4gKiBgcGlwZWxpbmUtbWFuYWdlcmAncyBgc2V0dXAtZXZlbnRzYCBjb21tYW5kIGRlcGxveXMgdGhpcyBMYW1iZGEgYnkgY29weWluZ1xuICogdGhlIGNvbXBpbGVkIGBsaWIvaW5kZXguanNgICoqYXMgb25lIGZpbGUqKiBpbnRvIHRoZSB6aXBcbiAqIChgY29tbWFuZHMvc2V0dXAtZXZlbnRzLnRzYDogYGNvcHlGaWxlU3luYyhoYW5kbGVyU3JjLCBpbmRleC5tanMpYCDihpIgYHppcCAtamApLlxuICogTm90aGluZyBidW5kbGVzIGl0LiBTbyB0aGUgbW9tZW50IHRoaXMgZmlsZSBnYWlucyBhIHJlbGF0aXZlIGltcG9ydCBvZiBhXG4gKiBzaWJsaW5nIG1vZHVsZSwgdGhlIGVtaXR0ZWQgYGxpYi9pbmRleC5qc2AgcmVmZXJlbmNlcyBhIGZpbGUgdGhhdCBpcyBub3QgaW5cbiAqIHRoZSB6aXAgYW5kIHRoZSBMYW1iZGEgZGllcyBhdCBpbml0IHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGUgJy4v4oCmJ1wiLlxuICpcbiAqIFRoYXQgbWFrZXMgdGhlIHVzdWFsIGh5Z2llbmUgaW5zdGluY3Qg4oCUIFwiOTczIGxpbmVzIGFuZCBuaW5lIG1vZHVsZS1sZXZlbFxuICogY2FjaGVzLCBzcGxpdCBpdCBpbnRvIHNjbS1yZXNvbHZlcnMgLyBwYXJzZS1yZWNvcmQgLyBkbHEtaGVhbHRoXCIg4oCUIGFcbiAqIHByb2R1Y3Rpb24gb3V0YWdlIHJhdGhlciB0aGFuIGEgY2xlYW51cC4gSXQgaXMgYWxzbyB3aHkgYF9yZXNldEZvclRlc3RzKClgXG4gKiBleGlzdHM6IHdpdGggZXZlcnkgY2FjaGUgaW4gb25lIG1vZHVsZSwgdGVzdHMgaGF2ZSBubyBvdGhlciBzZWFtLlxuICpcbiAqIElmIHRoaXMgZ2VudWluZWx5IG5lZWRzIHNwbGl0dGluZywgYWRkIGEgYnVuZGxpbmcgc3RlcCAoZXNidWlsZCDihpIgb25lXG4gKiBgbGliL2luZGV4LmpzYCkgdG8gdGhlIGJ1aWxkIEZJUlNULCBhbmQgb25seSB0aGVuIGJyZWFrIHRoZSBmaWxlIHVwLlxuICovXG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIGJ1bmRsZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUvQ29kZUNvbW1pdC9TUVNcbi8vIGNsaWVudHMgYXJlIGxvYWRlZCBsYXppbHkgdmlhIGR5bmFtaWMgaW1wb3J0KCkg4oCUIGEgc3RhdGljIHdvcmtzcGFjZSBkZXBlbmRlbmN5IG9uXG4vLyB0aGVtIHdvdWxkIHBlcnR1cmIgdGhlIHNoYXJlZCBAYXdzLXNkayB2ZXJzaW9uIHRyZWUgYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJ1xuLy8gdHlwaW5ncy4gVGhlIGR5bmFtaWMgaW1wb3J0IGtlZXBzIHRoZW0gb3V0IG9mIHRoZSBzdGF0aWMgZ3JhcGggd2hpbGUgc3RheWluZ1xuLy8gRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpIGFuZCBtb2NrYWJsZS4gTWluaW1hbCBsb2NhbFxuLy8gdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuIGBAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdGAgYW5kXG4vLyBgQGF3cy1zZGsvY2xpZW50LXNxc2AgYXJlIE5PVCBkZXZEZXBlbmRlbmNpZXMgb2YgdGhpcyBwYWNrYWdlICh0aGV5IHJlc29sdmUgb25seVxuLy8gaW5zaWRlIHRoZSBMYW1iZGEgcnVudGltZSAvIGplc3QgbW9ja3MpLCBzbyB0aGV5IGFyZSBpbXBvcnRlZCB0aHJvdWdoIGFcbi8vIHZhcmlhYmxlLXNwZWNpZmllciBoZWxwZXIgYmVsb3cgc28gYHRzY2AgZG9lcyBub3QgdHJ5IHRvIHJlc29sdmUgdGhlbS5cbmludGVyZmFjZSBMaXN0VGFnc091dHB1dCB7IHRhZ3M/OiBBcnJheTx7IGtleT86IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZUNsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPExpc3RUYWdzT3V0cHV0PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lTW9kdWxlIHtcbiAgQ29kZVBpcGVsaW5lQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBDb2RlUGlwZWxpbmVDbGllbnRMaWtlO1xuICBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZDogbmV3IChpbnB1dDogeyByZXNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZXBpcGVsaW5lTW9kOiBDb2RlUGlwZWxpbmVNb2R1bGUgfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29kZVBpcGVsaW5lKCk6IFByb21pc2U8Q29kZVBpcGVsaW5lTW9kdWxlPiB7XG4gIGlmICghY29kZXBpcGVsaW5lTW9kKSBjb2RlcGlwZWxpbmVNb2QgPSAoYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJykpIGFzIHVua25vd24gYXMgQ29kZVBpcGVsaW5lTW9kdWxlO1xuICByZXR1cm4gY29kZXBpcGVsaW5lTW9kO1xufVxuXG4vLyBWYXJpYWJsZS1zcGVjaWZpZXIgbG9hZGVyIGZvciBTREsgY2xpZW50cyB0aGF0IGFyZSBOT1Qgc3RhdGljIGRldkRlcGVuZGVuY2llcyBvZlxuLy8gdGhpcyBwYWNrYWdlIChwcmVzZW50IG9ubHkgaW4gdGhlIExhbWJkYSBydW50aW1lIC8gamVzdCBtb2NrcykuIFBhc3NpbmcgdGhlXG4vLyBzcGVjaWZpZXIgYXMgYSBgc3RyaW5nYCBrZWVwcyBgdHNjYCBmcm9tIHJlc29sdmluZyB0aGUgbW9kdWxlIGF0IGJ1aWxkIHRpbWUuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2RrPFQ+KHBrZzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KHBrZykpIGFzIFQ7XG59XG5cbi8qKlxuICogUGlwZWxpbmUgZXZlbnQgaW5nZXN0aW9uIExhbWJkYSBoYW5kbGVyLlxuICpcbiAqIFJlY2VpdmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgZXZlbnRzIGZyb20gU1FTIChzb3VyY2VkIGJ5IEV2ZW50QnJpZGdlKSxcbiAqIHBhcnNlcyB0aGVtIGludG8gYSBub3JtYWxpemVkIGZvcm1hdCwgYW5kIFBPU1RzIHRoZW0gdG8gdGhlIHJlcG9ydGluZyBzZXJ2aWNlXG4gKiB2aWEgUExBVEZPUk1fQkFTRV9VUkwuXG4gKlxuICogQXV0aGVudGljYXRpb24gKCNOMiDigJQgc2VydmljZS1hY2NvdW50IGtleXMpOlxuICogVGhlIExhbWJkYSBob2xkcyBhbiBvcGFxdWUgU0VSVklDRS1BQ0NPVU5UIEtFWSAoYHBiX3NhX+KApmApLCBuZXZlciBhIEpXVCwgYW5kXG4gKiB0cmFkZXMgaXQgYXQgcGxhdGZvcm0ncyBgL2F1dGgvdG9rZW4vZXhjaGFuZ2VgIGZvciBhIDUtbWludXRlIHRva2VuIHBlciBiYXRjaC5cbiAqIEl0IHZlcmlmaWVzIE5PVEhJTkcgbG9jYWxseTogYW4gb3BhcXVlIGtleSBjYXJyaWVzIG5vIGNsYWltcyB0byBjaGVjaywgYW5kIHRoZVxuICogZXhjaGFuZ2UgaXMgdGhlIGF1dGhvcml0eSAoYSByZXZva2VkIGtleSBzdG9wcyB3b3JraW5nIHdpdGhpbiBvbmUgdG9rZW5cbiAqIGxpZmV0aW1lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIHRoZSBzaGFwZSkuIFRoZSBrZXkgaXMgbWludGVkIGJ5XG4gKiBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgYW5kIHJvdGF0ZWQgaW4gcGxhY2UgYnkgdGhlIHRva2VuLXJlbmV3XG4gKiBMYW1iZGEsIHNvIHRoZSBzZWNyZXQncyB2YWx1ZSBjaGFuZ2VzIHVuZGVybmVhdGggYSB3YXJtIGNvbnRhaW5lciDigJQgd2hpY2ggaXNcbiAqIHdoeSBhbiBhdXRoIGZhaWx1cmUgcmUtcmVhZHMgdGhlIFNFQ1JFVCwgbm90IGp1c3QgdGhlIHRva2VuLlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gUExBVEZPUk1fQkFTRV9VUkwg4oCUIEJhc2UgVVJMIG9mIHRoZSBwbGF0Zm9ybVxuICogLSBQTEFURk9STV9BQ0NFU1NfS0VZIOKAlCB0aGUgYHBiX3NhX+KApmAga2V5IHNldCBkaXJlY3RseSAobm8gU2VjcmV0cyBNYW5hZ2VyIGNhbGwpLCBvclxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSDigJQgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHsgcGFzc3dvcmQ6IDxwYl9zYV8ga2V5PiB9XG4gKiAtIEVWRU5UX0RMUV9BUk4g4oCUIChvcHRpb25hbCkgb3ZlcnJpZGUgZm9yIHRoZSBkZWFkLWxldHRlciBxdWV1ZSBBUk4gdXNlZCBieSB0aGVcbiAqICAgc2VsZi1oZWFsaW5nIHJlZHJpdmU7IGRlZmF1bHRzIHRvIGA8bWFpbi1xdWV1ZS1hcm4+LWRscWAgZGVyaXZlZCBmcm9tIHRoZSBTUVNcbiAqICAgdHJpZ2dlcidzIGV2ZW50U291cmNlQVJOLlxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgVGFnIHJlc29sdXRpb246IHBiLnBpcGVsaW5lLWlkICsgcGIuZGVwbG95cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGF0IENESyBzeW50aCB3aXRoOlxuLy8gICBwYi5waXBlbGluZS1pZCA9IDxwbGF0Zm9ybSBwaXBlbGluZUlkPlxuLy8gICBwYi5kZXBsb3lzICAgICA9IDxzdGFnZT46PGVudj4gcGFpcnMgam9pbmVkIGJ5ICcrJywgZS5nLlxuLy8gICAgICAgICAgICAgICAgICAgIFwiRGVwbG95LXN0ZzpzdGFnaW5nK0RlcGxveS1wcm9kOnByb2R1Y3Rpb25cIlxuLy8gV2UgcmVzb2x2ZSB0aG9zZSB0YWdzIGZyb20gdGhlIGxpdmUgQ29kZVBpcGVsaW5lIChyZWdpb24tYXdhcmUpLiBUaGUgQVJOL2FjY291bnRcbi8vIG5ldmVyIGxlYXZlIEFXUywgc28gdGhlcmUncyBubyBtYXNraW5nLiBDYWNoZWQgcGVyIEFSTiAod2FybS1jb250YWluZXIpIHRvIGF2b2lkXG4vLyBoYW1tZXJpbmcgdGhlIExpc3RUYWdzIEFQSS5cbi8vXG4vLyBSZXF1aXJlcyB0aGUgTGFtYmRhIGV4ZWN1dGlvbiByb2xlIHRvIGFsbG93IGBjb2RlcGlwZWxpbmU6TGlzdFRhZ3NGb3JSZXNvdXJjZWAuXG4vLyBBY2Nlc3NEZW5pZWQgaXMgYSBjb25maWcgZXJyb3IgKGFsZXJ0IGxvdWRseSk7IGEgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcgaXNcbi8vIHRyZWF0ZWQgYXMgXCJub3QgeWV0IHJlZ2lzdGVyZWRcIiAoc2tpcCkuXG5cbmNvbnN0IFBJUEVMSU5FX0lEX1RBRyA9ICdwYi5waXBlbGluZS1pZCc7XG5jb25zdCBERVBMT1lTX1RBRyA9ICdwYi5kZXBsb3lzJztcbi8vIENhbm9uaWNhbCBwZXItcGlwZWxpbmUgb3JnIHRhZyAoYXBwbGllZCBhdCBzeW50aCBieSBwaXBlbGluZS1jb3JlKS4gSXQgaXMgdGhlXG4vLyBSRVNPTFZFRCBvcmcgZm9yIGV2ZXJ5IGV2ZW50IG9mIHRoaXMgcGlwZWxpbmUg4oCUIHVzZWQgdG8ga2V5IHRoZSBwZXItb3JnIEdpdEh1YlxuLy8gdG9rZW4gYW5kIHRvIGF0dHJpYnV0ZSBpbmdlc3QtaGVhbHRoLiBvcmdJZCBpcyBhIHBsYXRmb3JtIGlkLCBuZXZlciBhbiBBV1Ncbi8vIGFjY291bnQgaWQsIHNvIGl0IGlzIHNhZmUgdG8gcmVhZC9mb3J3YXJkLlxuY29uc3QgT1JHX0lEX1RBRyA9ICdPcmdJZCc7XG5jb25zdCBjbGllbnRzQnlSZWdpb24gPSBuZXcgTWFwPHN0cmluZywgQ29kZVBpcGVsaW5lQ2xpZW50TGlrZT4oKTtcbi8vIHBpcGVsaW5lSWQ9bnVsbCBpcyBhIG5lZ2F0aXZlIGNhY2hlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpOyBgdHNgIGxldHMgbmVnYXRpdmVzXG4vLyBleHBpcmUgc28gYSBwaXBlbGluZSB0YWdnZWQgQUZURVIgaXRzIGZpcnN0IGV2ZW50IGJlY29tZXMgcmVzb2x2YWJsZSB3aXRob3V0XG4vLyByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyLiBQb3NpdGl2ZSByZXN1bHRzIHN0YXkgY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUuXG5jb25zdCByZXNvbHZlZEJ5QXJuID0gbmV3IE1hcDxzdHJpbmcsIHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgb3JnSWQ6IHN0cmluZyB8IG51bGw7IGRlcGxveXM6IE1hcDxzdHJpbmcsIHN0cmluZz47IHRzOiBudW1iZXIgfT4oKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogUmVzb2x2ZWQgcGlwZWxpbmUgbWV0YWRhdGEgcmVhZCBmcm9tIHRoZSBDb2RlUGlwZWxpbmUgcmVzb3VyY2UgdGFncy4gKi9cbmludGVyZmFjZSBSZXNvbHZlZFBpcGVsaW5lIHtcbiAgLyoqIFBsYXRmb3JtIHBpcGVsaW5lSWQgKHBiLnBpcGVsaW5lLWlkIHRhZyk7IG51bGwgd2hlbiB1bnRhZ2dlZC91bnJlZ2lzdGVyZWQuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQbGF0Zm9ybSBvcmdJZCAoT3JnSWQgdGFnKTsgbnVsbCB3aGVuIHRoZSBwaXBlbGluZSBjYXJyaWVzIG5vIG9yZyB0YWcuICovXG4gIG9yZ0lkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogTWFwIG9mIGRlcGxveS1zdGFnZSBuYW1lIOKGkiBlbnZpcm9ubWVudCAocGFyc2VkIGZyb20gcGIuZGVwbG95cykuIEVtcHR5IHdoZW4gbm9uZS4gKi9cbiAgZGVwbG95czogTWFwPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqIENhcCBvbiBjb21taXQvcmVmL2Vudmlyb25tZW50IGZpZWxkcyDigJQgdGhlIGluZ2VzdCBjb250cmFjdCBhbGxvd3MgbWF4IDI1NS4gKi9cbmNvbnN0IE1BWF9BVFRSID0gMjU1O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcGIuZGVwbG95c2AgdGFnIHZhbHVlIGludG8gYSBzdGFnZeKGkmVudmlyb25tZW50IG1hcC4gVGhlIHZhbHVlIGlzXG4gKiBgPHN0YWdlPjo8ZW52PmAgcGFpcnMgam9pbmVkIGJ5IGArYCAoQ29kZVBpcGVsaW5lLXRhZy1zYWZlOyBubyBKU09OKS4gQSBzdGFnZVxuICogcHJlc2VudCBoZXJlIGlzIGEgZGVwbG95OyBpdHMgbWFwcGVkIGVudmlyb25tZW50IGlzIHdoYXQgdGhlIGZvcndhcmRlciBzdGFtcHMgb25cbiAqIHRoYXQgc3RhZ2UncyBTVEFHRS9BQ1RJT04gZXZlbnRzIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuIE1hbGZvcm1lZCBwYWlycyBhcmVcbiAqIHNraXBwZWQgZGVmZW5zaXZlbHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGVwbG95cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGlmICghdmFsdWUpIHJldHVybiBtYXA7XG4gIGZvciAoY29uc3QgcGFpciBvZiB2YWx1ZS5zcGxpdCgnKycpKSB7XG4gICAgY29uc3QgaWR4ID0gcGFpci5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGlkeCA8PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBzdGFnZSA9IHBhaXIuc2xpY2UoMCwgaWR4KS50cmltKCk7XG4gICAgY29uc3QgZW52ID0gcGFpci5zbGljZShpZHggKyAxKS50cmltKCk7XG4gICAgaWYgKHN0YWdlICYmIGVudikgbWFwLnNldChzdGFnZSwgZW52LnNsaWNlKDAsIE1BWF9BVFRSKSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvZGVQaXBlbGluZUNsaWVudExpa2U+IHtcbiAgbGV0IGNsaWVudCA9IGNsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjb25zdCB7IENvZGVQaXBlbGluZUNsaWVudCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNsaWVudCA9IG5ldyBDb2RlUGlwZWxpbmVDbGllbnQoeyByZWdpb24gfSk7XG4gICAgY2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgQ29kZVBpcGVsaW5lJ3MgdGFncyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQgKHBiLnBpcGVsaW5lLWlkKSBwbHVzIHRoZVxuICogZGVwbG95LXN0YWdl4oaSZW52aXJvbm1lbnQgbWFwIChwYi5kZXBsb3lzKS4gYHBpcGVsaW5lSWRgIGlzIG51bGwgd2hlbiB0aGUgcGlwZWxpbmVcbiAqIGhhcyBubyBwYi5waXBlbGluZS1pZCB0YWcgKHVucmVnaXN0ZXJlZCkuIFRocm93cyBvbiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTVxuICogZ3JhbnQgc3VyZmFjZXMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZShhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFJlc29sdmVkUGlwZWxpbmU+IHtcbiAgY29uc3QgY2FjaGVkID0gcmVzb2x2ZWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBwb3NpdGl2ZSBoaXQgZm9yIHRoZSBjb250YWluZXIgbGlmZXRpbWU7IHNlcnZlIGEgbmVnYXRpdmUgaGl0IG9ubHlcbiAgLy8gdW50aWwgaXQgZXhwaXJlcyAodGhlbiByZS1yZXNvbHZlLCBpbiBjYXNlIHRoZSBwaXBlbGluZSB3YXMgc2luY2UgdGFnZ2VkKS5cbiAgaWYgKGNhY2hlZCAmJiAoY2FjaGVkLnBpcGVsaW5lSWQgIT09IG51bGwgfHwgRGF0ZS5ub3coKSAtIGNhY2hlZC50cyA8IE5FR19DQUNIRV9UVExfTVMpKSB7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogY2FjaGVkLnBpcGVsaW5lSWQsIG9yZ0lkOiBjYWNoZWQub3JnSWQsIGRlcGxveXM6IGNhY2hlZC5kZXBsb3lzIH07XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBwaXBlbGluZUNsaWVudChyZWdpb24pO1xuICAgIGNvbnN0IHsgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQoeyByZXNvdXJjZUFybjogYXJuIH0pKTtcbiAgICBjb25zdCBwaXBlbGluZUlkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBjb25zdCBvcmdJZCA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IE9SR19JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IGRlcGxveXMgPSBwYXJzZURlcGxveXMob3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gREVQTE9ZU19UQUcpPy52YWx1ZSk7XG4gICAgaWYgKCFwaXBlbGluZUlkKSBsb2cud2FybignUGlwZWxpbmUgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHNraXBwaW5nIChyZWdpc3RlciBpdD8pJywgeyBhcm4gfSk7XG4gICAgcmVzb2x2ZWRCeUFybi5zZXQoYXJuLCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzLCB0czogRGF0ZS5ub3coKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkLCBvcmdJZCwgZGVwbG95cyB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBuYW1lID0gKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWU7XG4gICAgaWYgKG5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XG4gICAgICAvLyBEb24ndCBjYWNoZSDigJQgdGhpcyBpcyBhIGZpeGFibGUgbWlzY29uZmlnLCBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgcGlwZWxpbmUuXG4gICAgICBsb2cuZXJyb3IoJ0FjY2Vzc0RlbmllZCBjYWxsaW5nIGNvZGVwaXBlbGluZTpMaXN0VGFnc0ZvclJlc291cmNlIOKAlCBncmFudCBpdCB0byB0aGUgTGFtYmRhIHJvbGUnLCB7IGFybiwgZXJyb3I6IG5hbWUgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIC8vIFRyYW5zaWVudC9pbmZyYSBlcnJvcnMgKHRocm90dGxpbmcsIHRpbWVvdXRzLCA1eHgpIE1VU1QgcHJvcGFnYXRlIHNvIHRoZSBTUVNcbiAgICAvLyBiYXRjaCBpcyByZXRyaWVkIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBldmVudCDigJQgYW4gZXZlbnQgZHJvcHBlZFxuICAgIC8vIEJFRk9SRSBpdCByZWFjaGVzIHRoZSBpbmdlc3QgaXMgbG9zdCBwZXJtYW5lbnRseSAodGhlIGluZ2VzdCdzIHBhcnRpYWwtdW5pcXVlXG4gICAgLy8gaW5kZXggb25seSBkZWR1cGVzIGV2ZW50cyB0aGF0IHdlcmUgYWN0dWFsbHkgUE9TVGVkKS4gT25seSBzd2FsbG93IHdoZW4gdGhlXG4gICAgLy8gZmFpbHVyZSBpcyBhIGRlZmluaXRpdmUgYW5zd2VyIHRoYXQgdGhpcyBBUk4gaGFzIG5vIHVzYWJsZSB0YWcuXG4gICAgY29uc3QgZSA9IGVyciBhcyB7IG5hbWU/OiBzdHJpbmc7ICRyZXRyeWFibGU/OiB1bmtub3duOyAkbWV0YWRhdGE/OiB7IGh0dHBTdGF0dXNDb2RlPzogbnVtYmVyIH0gfTtcbiAgICBjb25zdCBzdGF0dXMgPSBlLiRtZXRhZGF0YT8uaHR0cFN0YXR1c0NvZGU7XG4gICAgY29uc3QgcmV0cnlhYmxlID0gZS4kcmV0cnlhYmxlICE9IG51bGxcbiAgICAgIHx8ICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiBzdGF0dXMgPj0gNTAwKVxuICAgICAgfHwgL3Rocm90dGx8dGltZW91dHx0b29tYW55cmVxdWVzdHN8c2VydmljZXVuYXZhaWxhYmxlfGVjb25ucmVzZXR8bmV0d29ya2luZ2Vycm9yL2kudGVzdChuYW1lID8/ICcnKTtcbiAgICBpZiAocmV0cnlhYmxlKSB7XG4gICAgICBsb2cuZXJyb3IoJ1RyYW5zaWVudCBlcnJvciByZXNvbHZpbmcgcGIucGlwZWxpbmUtaWQgdGFnIOKAlCB3aWxsIHJldHJ5IHRoZSBiYXRjaCcsIHsgYXJuLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBwYi5waXBlbGluZS1pZCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogbnVsbCwgb3JnSWQ6IG51bGwsIGRlcGxveXM6IG5ldyBNYXAoKSB9O1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgCBBdXRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFRoZSBzdG9yZWQgY3JlZGVudGlhbCBpcyBhbiBPUEFRVUUgc2VydmljZS1hY2NvdW50IGtleSAoYHBiX3NhX+KApmApLCB0cmFkZWQgYXRcbi8vIHBsYXRmb3JtIGZvciBhIHNob3J0LWxpdmVkIEpXVC4gTm90aGluZyBpcyB2ZXJpZmllZCBoZXJlOiBhbiBvcGFxdWUga2V5IGhhcyBub1xuLy8gY2xhaW1zIGFuZCBubyBzaWduYXR1cmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgYSBsb2NhbCBjaGVjayBjb3VsZCB0ZWxsIHlvdSB0aGF0XG4vLyB0aGUgZXhjaGFuZ2UgZG9lcyBub3QgdGVsbCB5b3UgYmV0dGVyIOKAlCBhbmQgdGhlIGV4Y2hhbmdlIHJlLXJlYWRzIHRoZSBhY2NvdW50LFxuLy8gaXRzIG9yZyBhbmQgdGhlIGtleSdzIG93biBzdGF0ZSBldmVyeSB0aW1lLCB3aGljaCBpcyB3aGF0IG1ha2VzIGEgcmV2b2NhdGlvblxuLy8gdGFrZSBlZmZlY3Qgd2l0aGluIG9uZSB0b2tlbiBsaWZldGltZS5cbi8vXG4vLyBUaGlzIGNvZGUgaXMgZGVsaWJlcmF0ZWx5IHNlbGYtY29udGFpbmVkIChzZWUgdGhlIGZpbGUgaGVhZGVyOiB0aGUgTGFtYmRhIHNoaXBzXG4vLyBhcyBPTkUgZmlsZSksIHNvIGl0IGRvZXMgbm90IHVzZSBhcGktY29yZSdzIGV4Y2hhbmdlIGNsaWVudC4gSXQga2VlcHMgdGhlIHNhbWVcbi8vIGNvbnRyYWN0OiBjYWNoZSB0aGUgdG9rZW4gaW4gdGhlIHdhcm0gY29udGFpbmVyLCByZWZyZXNoIEVBUkxZIChiZWZvcmUgZXhwaXJ5KVxuLy8gc28gYSBiYXRjaCBuZXZlciBwcmVzZW50cyBhIHRva2VuIHRoYXQgZGllcyBtaWQtZmxpZ2h0LCBhbmQgZmFpbCB0aGUgYmF0Y2ggb25cbi8vIGFuIGV4Y2hhbmdlIGZhaWx1cmUgcmF0aGVyIHRoYW4gc2hpcHBpbmcgZXZlbnRzIHVuYXV0aGVudGljYXRlZC5cblxuLyoqIFJlZnJlc2ggYXQgdGhpcyBmcmFjdGlvbiBvZiB0aGUgdG9rZW4ncyBsaWZlIOKAlCBuZXZlciBhdCB0aGUgbGFzdCBtb21lbnQuICovXG5jb25zdCBUT0tFTl9SRUZSRVNIX0ZSQUNUSU9OID0gMC44O1xuLyoqIEZsb29yIG9uIHRoZSBjYWNoZWQgbGlmZXRpbWUsIHNvIGEgc3VycHJpc2luZ2x5IHNob3J0IFRUTCBjYW4ndCBjYXVzZSBhXG4gKiAgcmVmcmVzaCBzdG9ybSAob25lIGV4Y2hhbmdlIHBlciBiYXRjaCBhdCB3b3JzdCkuICovXG5jb25zdCBNSU5fVE9LRU5fQ0FDSEVfTVMgPSAzMF8wMDA7XG4vKiogUGVyLXJlcXVlc3QgdGltZW91dCBmb3IgdGhlIGV4Y2hhbmdlIGNhbGwuICovXG5jb25zdCBFWENIQU5HRV9USU1FT1VUX01TID0gNTAwMDtcblxuLyoqIEFjY2Vzcy1rZXkgcHJlZml4ZXMgcGxhdGZvcm0gaXNzdWVzLiBBIHN0b3JlZCBKV1QgaXMgTk9UIG9uZSBvZiB0aGVzZS4gKi9cbmNvbnN0IEFDQ0VTU19LRVlfUFJFRklYRVMgPSBbJ3BiX3NhXycsICdwYl9wYXRfJ107XG5cbmxldCBjYWNoZWRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xubGV0IGNhY2hlZFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbmxldCBjYWNoZWRUb2tlbkV4cGlyZXNBdCA9IDA7XG5cbi8qKlxuICogUmVhZCAoYW5kIGNhY2hlKSB0aGUgc2VydmljZS1hY2NvdW50IGtleTogYFBMQVRGT1JNX0FDQ0VTU19LRVlgIGlmIHNldCxcbiAqIG90aGVyd2lzZSB0aGUgYHBhc3N3b3JkYCBmaWVsZCBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBuYW1lZCBieVxuICogYFBMQVRGT1JNX1NFQ1JFVF9OQU1FYC5cbiAqXG4gKiBGYWlscyBDTE9TRUQgYW5kIExPVURMWSBvbiBhIHN0b3JlZCBKV1QuIEFmdGVyIHRoZSAjTjIgY3V0b3ZlciB0aGUgc2VjcmV0IGhvbGRzXG4gKiBhIGtleSwgYW5kIGEgZGVwbG95bWVudCBzdGlsbCBjYXJyeWluZyB0aGUgb2xkIG1hY2hpbmUtc2Vzc2lvbiBKV1Qgd291bGRcbiAqIG90aGVyd2lzZSBmYWlsIGxhdGVyIGFzIGFuIG9wYXF1ZSA0MDEgZnJvbSB0aGUgcmVwb3J0aW5nIEFQSSDigJQgdGhyZWUgbGF5ZXJzXG4gKiBhd2F5IGZyb20gdGhlIHRoaW5nIGFuIG9wZXJhdG9yIGhhcyB0byBmaXguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY2Vzc0tleSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkS2V5KSByZXR1cm4gY2FjaGVkS2V5O1xuXG4gIGNvbnN0IGRpcmVjdCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0FDQ0VTU19LRVk7XG4gIGlmIChkaXJlY3QpIHtcbiAgICBhc3NlcnRBY2Nlc3NLZXkoZGlyZWN0LCAnUExBVEZPUk1fQUNDRVNTX0tFWScpO1xuICAgIGNhY2hlZEtleSA9IGRpcmVjdDtcbiAgICBsb2cuaW5mbygnVXNpbmcgUExBVEZPUk1fQUNDRVNTX0tFWSBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZEtleTtcbiAgfVxuXG4gIGNvbnN0IHNlY3JldE5hbWUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbiAgaWYgKCFzZWNyZXROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9BQ0NFU1NfS0VZIG9yIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBsb2cuaW5mbyhgRmV0Y2hpbmcgYWNjZXNzIGtleSBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG4gIGlmICghcmVzcG9uc2UuU2VjcmV0U3RyaW5nKSB0aHJvdyBuZXcgRXJyb3IoYFNlY3JldCBcIiR7c2VjcmV0TmFtZX1cIiBpcyBlbXB0eWApO1xuXG4gIGNvbnN0IHNlY3JldCA9IEpTT04ucGFyc2UocmVzcG9uc2UuU2VjcmV0U3RyaW5nKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvLyBgcGFzc3dvcmRgIHN0YXlzIHRoZSBjYW5vbmljYWwgZmllbGQgKENvZGVCdWlsZCdzIHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNcbiAgLy8gYW5kIHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSByZWFkIHRoZSBzYW1lIG9uZSkg4oCUIG9ubHkgaXRzIFZBTFVFIGNoYW5nZWQsXG4gIC8vIGZyb20gYSBKV1QgdG8gYW4gb3BhcXVlIGtleS5cbiAgY29uc3Qga2V5ID0gc2VjcmV0LnBhc3N3b3JkO1xuICBpZiAoIWtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIG1pc3NpbmcgcGFzc3dvcmQg4oCUIHJ1biBcInBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5cIiB0byBwcm92aXNpb24gYSBzZXJ2aWNlLWFjY291bnQga2V5YCk7XG4gIH1cbiAgYXNzZXJ0QWNjZXNzS2V5KGtleSwgYHNlY3JldCBcIiR7c2VjcmV0TmFtZX1cImApO1xuXG4gIGNhY2hlZEtleSA9IGtleTtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBzZXJ2aWNlLWFjY291bnQga2V5IGZyb20gU2VjcmV0cyBNYW5hZ2VyJyk7XG4gIHJldHVybiBjYWNoZWRLZXk7XG59XG5cbi8qKiBSZWZ1c2UgYW55dGhpbmcgdGhhdCBpcyBub3QgYW4gb3BhcXVlIGFjY2VzcyBrZXksIG5hbWluZyB3aGVyZSBpdCBjYW1lIGZyb20uICovXG5mdW5jdGlvbiBhc3NlcnRBY2Nlc3NLZXkodmFsdWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKEFDQ0VTU19LRVlfUFJFRklYRVMuc29tZSgocCkgPT4gdmFsdWUuc3RhcnRzV2l0aChwKSkpIHJldHVybjtcbiAgY29uc3QgbG9va3NMaWtlSnd0ID0gdmFsdWUuc3BsaXQoJy4nKS5sZW5ndGggPT09IDM7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtzb3VyY2V9IGRvZXMgbm90IGhvbGQgYW4gb3BhcXVlIGFjY2VzcyBrZXkgKGV4cGVjdGVkIGEgXCJwYl9zYV/igKZcIiB2YWx1ZSlgXG4gICAgKyAobG9va3NMaWtlSnd0XG4gICAgICA/ICcg4oCUIGl0IHN0aWxsIGhvbGRzIGEgSldUIGZyb20gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnQgY3V0b3Zlci4gUmUtcnVuIFwicGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlblwiIHRvIHJlaXNzdWUgaXQgYXMgYSBrZXkuJ1xuICAgICAgOiAnLicpLFxuICApO1xufVxuXG4vKipcbiAqIFRyYWRlIHRoZSBzdG9yZWQga2V5IGZvciBhIHNob3J0LWxpdmVkIHBsYXRmb3JtIHRva2VuLCBjYWNoZWQgcGVyIHdhcm1cbiAqIGNvbnRhaW5lciB1bnRpbCBpdCBpcyA4MCUgdGhyb3VnaCBpdHMgbGlmZS4gVGhyb3dzIG9uIGFueSBmYWlsdXJlLCB3aGljaCBmYWlsc1xuICogdGhlIGJhdGNoIHNvIFNRUyByZXRyaWVzIGl0IOKAlCBhbiB1bmF1dGhlbnRpY2F0ZWQgc2hpcCBpcyBuZXZlciBhbiBvcHRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4gJiYgRGF0ZS5ub3coKSA8IGNhY2hlZFRva2VuRXhwaXJlc0F0KSByZXR1cm4gY2FjaGVkVG9rZW47XG5cbiAgY29uc3QgYmFzZVVybCA9IChwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCB8fCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9CQVNFX1VSTCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICBjb25zdCBrZXkgPSBhd2FpdCBnZXRBY2Nlc3NLZXkoKTtcblxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBFWENIQU5HRV9USU1FT1VUX01TKTtcbiAgbGV0IHJlczogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL2F1dGgvdG9rZW4vZXhjaGFuZ2VgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBrZXkgfSksXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH1cblxuICBpZiAoIXJlcy5vaykge1xuICAgIC8vIEEgcmVqZWN0ZWQga2V5IGlzIHRoZSBvbmUgZmFpbHVyZSBhbiBvcGVyYXRvciBoYXMgdG8gYWN0IG9uLCBhbmQgcGxhdGZvcm1cbiAgICAvLyBkZWxpYmVyYXRlbHkgYW5zd2VycyBldmVyeSByZWZ1c2FsIHRoZSBzYW1lIHdheSDigJQgc28gc2F5IHdoYXQgdG8gY2hlY2tcbiAgICAvLyByYXRoZXIgdGhhbiBlY2hvaW5nIGFuIHVuZGlmZmVyZW50aWF0ZWQgNDAxLlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBY2Nlc3Mta2V5IGV4Y2hhbmdlIHJlZnVzZWQgKCR7cmVzLnN0YXR1c30pIOKAlCB0aGUgc3RvcmVkIGtleSBpcyB1bmtub3duLCByZXZva2VkLCBleHBpcmVkLCBgXG4gICAgICAgICsgJ2l0cyBzZXJ2aWNlIGFjY291bnQgaXMgZGlzYWJsZWQsIG9yIHRoaXMgYWRkcmVzcyBpcyBvdXRzaWRlIHRoZSBrZXnigJlzIElQIGFsbG93bGlzdCcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFjY2Vzcy1rZXkgZXhjaGFuZ2UgZmFpbGVkOiAke3Jlcy5zdGF0dXN9YCk7XG4gIH1cblxuICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKSBhcyB7IGRhdGE/OiB7IGFjY2Vzc1Rva2VuPzogc3RyaW5nOyBleHBpcmVzSW4/OiBudW1iZXIgfSB9O1xuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGJvZHkuZGF0YT8uYWNjZXNzVG9rZW47XG4gIGlmICghYWNjZXNzVG9rZW4pIHRocm93IG5ldyBFcnJvcignQWNjZXNzLWtleSBleGNoYW5nZSByZXR1cm5lZCBubyBhY2Nlc3MgdG9rZW4nKTtcblxuICBjb25zdCB0dGxNcyA9ICh0eXBlb2YgYm9keS5kYXRhPy5leHBpcmVzSW4gPT09ICdudW1iZXInICYmIGJvZHkuZGF0YS5leHBpcmVzSW4gPiAwID8gYm9keS5kYXRhLmV4cGlyZXNJbiA6IDMwMCkgKiAxMDAwO1xuICBjYWNoZWRUb2tlbiA9IGFjY2Vzc1Rva2VuO1xuICBjYWNoZWRUb2tlbkV4cGlyZXNBdCA9IERhdGUubm93KCkgKyBNYXRoLm1heChNSU5fVE9LRU5fQ0FDSEVfTVMsIHR0bE1zICogVE9LRU5fUkVGUkVTSF9GUkFDVElPTik7XG4gIGxvZy5pbmZvKCdFeGNoYW5nZWQgdGhlIHN0b3JlZCBzZXJ2aWNlLWFjY291bnQga2V5IGZvciBhIHBsYXRmb3JtIHRva2VuJyk7XG4gIHJldHVybiBhY2Nlc3NUb2tlbjtcbn1cblxuLyoqXG4gKiBEcm9wIGV2ZXJ5dGhpbmcgdGhlIGNvbnRhaW5lciBpcyBob2xkaW5nIGFib3V0IGl0cyBjcmVkZW50aWFsIGFmdGVyIGEgNDAxLzQwM1xuICogZnJvbSB0aGUgQVBJLiBUaGUgdG9rZW4gaXMgZHJvcHBlZCBmb3IgdGhlIG9idmlvdXMgcmVhc29uOyB0aGUgS0VZIGlzIGRyb3BwZWRcbiAqIGJlY2F1c2UgdGhlIHRva2VuLXJlbmV3IExhbWJkYSByb3RhdGVzIHRoZSBzZWNyZXQgdW5kZXJuZWF0aCB1cyDigJQgYSB3YXJtXG4gKiBjb250YWluZXIgdGhhdCBvbmx5IHJlLWV4Y2hhbmdlZCB3b3VsZCBrZWVwIHByZXNlbnRpbmcgdGhlIHJldGlyZWQga2V5XG4gKiBmb3JldmVyLiBUaGUgbmV4dCBjYWxsIHJlLXJlYWRzIHRoZSBzZWNyZXQgYW5kIHBpY2tzIHVwIHRoZSByZXBsYWNlbWVudC5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZGF0ZUNyZWRlbnRpYWwoKTogdm9pZCB7XG4gIGNhY2hlZFRva2VuID0gbnVsbDtcbiAgY2FjaGVkVG9rZW5FeHBpcmVzQXQgPSAwO1xuICAvLyBPbmx5IHRoZSBTRUNSRVQgcGF0aCBjYW4gYmUgcmVmcmVzaGVkOyBhbiBlbnYtcHJvdmlkZWQga2V5IGNhbm5vdCBjaGFuZ2VcbiAgLy8gd2l0aG91dCBhIG5ldyBjb250YWluZXIsIHNvIGtlZXAgaXQgcmF0aGVyIHRoYW4gcmUtcmVhZGluZyBhbiBlbnYgdmFyLlxuICBpZiAoIXByb2Nlc3MuZW52LlBMQVRGT1JNX0FDQ0VTU19LRVkpIGNhY2hlZEtleSA9IG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgCBQaGFzZSA0OiBpbi1hY2NvdW50IGNvbW1pdC1yYW5nZSByZXNvbHV0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRm9yIGEgc291cmNlL2RlcGxveSBldmVudCBjYXJyeWluZyBhIGNvbW1pdFNoYSB3ZSByZXNvbHZlIHRoZSBjb21taXQgdGltZXN0YW1wXG4vLyAoYW5kIGhvdyBtYW55IGNvbW1pdHMgc2hpcHBlZCkgZm9yIHRoZSByYW5nZSBzaW5jZSB0aGUgbGFzdCByZXNvbHZlZCBzaGEgb2YgdGhlXG4vLyBzYW1lIHBpcGVsaW5lIOKAlCBlbnRpcmVseSBJTi1BQ0NPVU5ULCBwZXIgc291cmNlIHR5cGU6XG4vLyAgIOKAoiBDb2RlQ29tbWl0ICDihpIgQVdTIFNESyBHZXRDb21taXQgKHdhbGsgZmlyc3QtcGFyZW50cyBiYWNrIHRvIHRoZSBib3VuZGFyeSkuXG4vLyAgIOKAoiBHaXRIdWIvQ29kZUNvbm5lY3Rpb25zLUdpdEh1YiDihpIgR2l0SHViIFJFU1QgY29tcGFyZS9jb21taXRzIEFQSS4gQXV0aGVudGljYXRlZFxuLy8gICAgIHdpdGggdGhlIG9yZydzIGBwaXBlbGluZS1idWlsZGVyL3tvcmdJZH0vZ2l0aHViLXRva2VuYCBzZWNyZXQgd2hlbiBwcmVzZW50XG4vLyAgICAgKGRlcml2ZWQgZnJvbSBQTEFURk9STV9TRUNSRVRfTkFNRSksIG90aGVyd2lzZSBiZXN0LWVmZm9ydCB1bmF1dGhlbnRpY2F0ZWQuXG4vLyAgIOKAoiBCaXRidWNrZXQgICDihpIgQml0YnVja2V0IFJFU1QgY29tbWl0IEFQSSAoc2luZ2xlLWNvbW1pdDsgcmFuZ2Ugd2FsayBvbWl0dGVkKS5cbi8vIFRoZSBvbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCdzIHRpbWVzdGFtcCDihpIgYGNvbW1pdFRpbWVzdGFtcGA7IHRoZSBudW1iZXIgb2YgY29tbWl0c1xuLy8gaW4gdGhlIHJhbmdlIOKGkiBgY29tbWl0Q291bnRgLiBFdmVyeXRoaW5nIGhlcmUgaXMgQkVTVC1FRkZPUlQ6IG9uIGFueSBmYWlsdXJlIHRoZVxuLy8gZmllbGRzIGFyZSBzaW1wbHkgb21pdHRlZCAocmVwb3J0aW5nIGZhbGxzIGJhY2sgdG8gYHVua25vd25gKS4gSXQgbXVzdCBORVZFUiBmYWlsXG4vLyB0aGUgYmF0Y2guXG4vL1xuLy8gSUFNIHJlcXVpcmVkIGJ5IHRoaXMgcGF0aCAoZG9jdW1lbnQgb25seSDigJQgZ3JhbnRlZCBvbiB0aGUgZXZlbnRzIHN0YWNrKTpcbi8vICAg4oCiIGNvZGVjb21taXQ6R2V0Q29tbWl0ICAgICAgICAgICAgKENvZGVDb21taXQgc291cmNlcylcbi8vICAg4oCiIHNlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlIG9uIGBwaXBlbGluZS1idWlsZGVyLyovZ2l0aHViLXRva2VuYCAodG9rZW4gU0NNIHNvdXJjZXMpXG5cbnR5cGUgU291cmNlUHJvdmlkZXIgPSAnZ2l0aHViJyB8ICdiaXRidWNrZXQnIHwgJ2NvZGVjb21taXQnIHwgJ3Vua25vd24nO1xuaW50ZXJmYWNlIFNvdXJjZVJlZiB7XG4gIHNoYTogc3RyaW5nO1xuICBwcm92aWRlcjogU291cmNlUHJvdmlkZXI7XG4gIG93bmVyPzogc3RyaW5nO1xuICByZXBvPzogc3RyaW5nO1xuICByZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbn1cbmludGVyZmFjZSBDb21taXRJbmZvIHsgY29tbWl0VGltZXN0YW1wPzogc3RyaW5nOyBjb21taXRDb3VudD86IG51bWJlciB9XG5cbi8vIFBlci0ocGlwZWxpbmUsc2hhKSByZXNvbHZlZCByZXN1bHQg4oCUIGNvbXB1dGVkIG9uY2UsIHJldXNlZCBhY3Jvc3MgdGhlIG1hbnkgZXZlbnRzXG4vLyAoUElQRUxJTkUvU1RBR0UvQUNUSU9OKSB0aGF0IHNoYXJlIGEgc291cmNlIHJldmlzaW9uIGFuZCBhY3Jvc3MgcmVkZWxpdmVyaWVzLlxuY29uc3QgY29tbWl0UmVzdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ29tbWl0SW5mbz4oKTtcbi8vIExhc3Qgc2hhIHdlIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBwZXIgcGlwZWxpbmUg4oCUIHRoZSBleGNsdXNpdmUgbG93ZXIgYm91bmQgZm9yIHRoZVxuLy8gbmV4dCByYW5nZSAoXCJjb21taXRzIHNpbmNlIHRoZSBsYXN0IGRlcGxveVwiKS4gSW4tbWVtb3J5IG9ubHk6IGEgY29sZCBzdGFydCByZXNldHNcbi8vIGl0LCBzbyB0aGUgZmlyc3QgcG9zdC1jb2xkIGV2ZW50IHJlc29sdmVzIGFzIGEgc2luZ2xlIGNvbW1pdCAoZXhwZWN0ZWQsIGRlZmVuc2l2ZSkuXG5jb25zdCBsYXN0U2hhQnlQaXBlbGluZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4vLyBQZXItc2hhIENvZGVDb21taXQgbWV0YWRhdGEgY2FjaGUgKGRhdGUgKyBmaXJzdC1wYXJlbnQpIGZvciByYW5nZSB3YWxrcy5cbmNvbnN0IGNvbW1pdE1ldGFDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IGRhdGU/OiBzdHJpbmc7IHBhcmVudHM/OiBzdHJpbmdbXSB9PigpO1xuLy8gU0NNIHJhdGUtbGltaXQgY29vbGRvd246IGFmdGVyIGEgNDAzLzQyOSB3ZSBzdG9wIGNhbGxpbmcgdGhlIFNDTSBmb3IgYSB3aGlsZS5cbmxldCBzY21Db29sZG93blVudGlsID0gMDtcbmNvbnN0IFNDTV9DT09MRE9XTl9NUyA9IDIgKiA2MCAqIDEwMDA7XG4vLyBDYXAgdGhlIENvZGVDb21taXQgZmlyc3QtcGFyZW50IHdhbGsgc28gYSBsb25nIHJhbmdlIGNhbid0IGJsb3cgdGhlIExhbWJkYSB0aW1lb3V0LlxuY29uc3QgTUFYX0NPTU1JVF9XQUxLID0gNTA7XG4vLyBQZXItcmVxdWVzdCB0aW1lb3V0IGZvciBleHRlcm5hbCBTQ00gY2FsbHMgKGRlZmVuc2l2ZSBhZ2FpbnN0IHNsb3cvaHVuZyBob3N0cykuXG5jb25zdCBTQ01fRkVUQ0hfVElNRU9VVF9NUyA9IDMwMDA7XG5cbi8vIFRoZSBmb3J3YXJkZXIgaXMgYSBmbGVldCBMYW1iZGE6IG9uZSB3YXJtIGNvbnRhaW5lciByZXNvbHZlcyBldmVudHMgZm9yIE1BTllcbi8vIG9yZ3MsIHNvIHRoZSBHaXRIdWIgdG9rZW4gTVVTVCBiZSBrZXllZCBieSB0aGUgZXZlbnQncyByZXNvbHZlZCBvcmcgKG5vdCBhIHNpbmdsZVxuLy8gY29udGFpbmVyLWdsb2JhbCB0b2tlbikuIEVhY2ggb3JnJ3MgdG9rZW4gbGl2ZXMgYXQgYDxwcmVmaXg+LzxvcmdJZD4vZ2l0aHViLXRva2VuYCxcbi8vIGRlcml2ZWQgZnJvbSBQTEFURk9STV9TRUNSRVRfTkFNRSAoYDxwcmVmaXg+Lzxjb250YWluZXJPcmc+L3BsYXRmb3JtYCkuIG51bGwgY2FjaGVzXG4vLyBhIGRlZmluaXRpdmUgbWlzcyAobm8gc2VjcmV0IC8gcmVhZCBmYWlsZWQpIOKGkiB1bmF1dGhlbnRpY2F0ZWQgYmVzdC1lZmZvcnQuXG5jb25zdCBnaXRodWJUb2tlbkJ5T3JnID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbi8qKlxuICogRGVyaXZlIGEgc3BlY2lmaWMgb3JnJ3MgZ2l0aHViLXRva2VuIHNlY3JldCBuYW1lIGZyb20gUExBVEZPUk1fU0VDUkVUX05BTUVcbiAqIChgPHByZWZpeD4vPGNvbnRhaW5lck9yZz4vcGxhdGZvcm1gKS4gV2l0aCBhbiBgb3JnSWRgIHdlIHN3YXAgdGhlIG9yZyBzZWdtZW50XG4gKiAoYDxwcmVmaXg+LzxvcmdJZD4vZ2l0aHViLXRva2VuYCk7IHdpdGhvdXQgb25lIChwaXBlbGluZSBjYXJyaWVkIG5vIE9yZ0lkIHRhZykgd2VcbiAqIGZhbGwgYmFjayB0byB0aGUgY29udGFpbmVyJ3Mgb3duIHNpYmxpbmcgc2VjcmV0LiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuXG4gKiBQTEFURk9STV9TRUNSRVRfTkFNRSBpc24ndCB0aGUgZXhwZWN0ZWQgYC4uLi9wbGF0Zm9ybWAgc2hhcGUuXG4gKi9cbmZ1bmN0aW9uIGdpdGh1YlRva2VuU2VjcmV0TmFtZShvcmdJZDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbiAgaWYgKCFuYW1lIHx8ICFuYW1lLmVuZHNXaXRoKCcvcGxhdGZvcm0nKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFzZSA9IG5hbWUuc2xpY2UoMCwgLScvcGxhdGZvcm0nLmxlbmd0aCk7IC8vIDxwcmVmaXg+Lzxjb250YWluZXJPcmc+XG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IHNsYXNoID0gYmFzZS5sYXN0SW5kZXhPZignLycpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNsYXNoID4gMCA/IGJhc2Uuc2xpY2UoMCwgc2xhc2gpIDogYmFzZTtcbiAgICByZXR1cm4gYCR7cHJlZml4fS8ke29yZ0lkfS9naXRodWItdG9rZW5gO1xuICB9XG4gIHJldHVybiBgJHtiYXNlfS9naXRodWItdG9rZW5gO1xufVxuXG4vKiogUmVhZCAoYW5kIGNhY2hlLCBwZXIgb3JnKSB0aGUgb3JnIGdpdGh1YiB0b2tlbjsgbnVsbCDihpIgdW5hdXRoZW50aWNhdGVkIGJlc3QtZWZmb3J0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3JnSWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3Qga2V5ID0gb3JnSWQgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IGdpdGh1YlRva2VuQnlPcmcuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IGdpdGh1YlRva2VuU2VjcmV0TmFtZShvcmdJZCk7XG4gIGlmICghc2VjcmV0TmFtZSkgeyBnaXRodWJUb2tlbkJ5T3JnLnNldChrZXksIG51bGwpOyByZXR1cm4gbnVsbDsgfVxuICBsZXQgdG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KHt9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgR2V0U2VjcmV0VmFsdWVDb21tYW5kKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSkpO1xuICAgIC8vIFRoZSBnaXRodWItdG9rZW4gc2VjcmV0IGlzIGEgUkFXIHRva2VuIHN0cmluZyAobm90IEpTT04g4oCUIENESyByZXNvbHZlcyBpdCB2aWFcbiAgICAvLyB0aGUgZGVmYXVsdCBTZWNyZXRTdHJpbmcgd2l0aCBubyBrZXkpLlxuICAgIHRva2VuID0gcmVzLlNlY3JldFN0cmluZyAmJiByZXMuU2VjcmV0U3RyaW5nLmxlbmd0aCA+IDAgPyByZXMuU2VjcmV0U3RyaW5nLnRyaW0oKSA6IG51bGw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdObyBnaXRodWItdG9rZW4gc2VjcmV0IOKAlCBHaXRIdWIgY29tbWl0IHJlc29sdXRpb24gd2lsbCBiZSB1bmF1dGhlbnRpY2F0ZWQnLCB7IG9yZ0lkLCBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgfSk7XG4gICAgdG9rZW4gPSBudWxsO1xuICB9XG4gIGdpdGh1YlRva2VuQnlPcmcuc2V0KGtleSwgdG9rZW4pO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQodXJsOiBzdHJpbmcsIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBTQ01fRkVUQ0hfVElNRU9VVF9NUyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZldGNoKHVybCwgeyAuLi5vcHRzLCBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGNvbW1pdCBkYXRlIHRvIElTTyA4NjAxLiBBY2NlcHRzIElTTyBzdHJpbmdzIGFuZCBDb2RlQ29tbWl0J3NcbiAqICBcIjxlcG9jaC1zZWNvbmRzPiArWlpaWlwiIGZvcm0uIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdW5wYXJzZWFibGUuICovXG5mdW5jdGlvbiB0b0lzbyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXBvY2ggPSAvXihcXGR7OSx9KVxcYi8uZXhlYyh2YWx1ZS50cmltKCkpO1xuICBpZiAoZXBvY2gpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoTnVtYmVyKGVwb2NoWzFdKSAqIDEwMDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xuICB9XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xufVxuXG4vKiogQ2xhc3NpZnkgYSBzb3VyY2UtcmV2aXNpb24gVVJMIGludG8gYSBwcm92aWRlciArIHJlcG8gY29vcmRpbmF0ZXMuICovXG5mdW5jdGlvbiBjbGFzc2lmeVNvdXJjZSh1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9taXQ8U291cmNlUmVmLCAnc2hhJz4ge1xuICBpZiAoIXVybCkgcmV0dXJuIHsgcHJvdmlkZXI6ICd1bmtub3duJyB9O1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgaG9zdCA9IHUuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaG9zdCA9PT0gJ2dpdGh1Yi5jb20nIHx8IGhvc3QuZW5kc1dpdGgoJy5naXRodWIuY29tJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikgcmV0dXJuIHsgcHJvdmlkZXI6ICdnaXRodWInLCBvd25lcjogcGFydHNbMF0sIHJlcG86IHBhcnRzWzFdLnJlcGxhY2UoL1xcLmdpdCQvLCAnJykgfTtcbiAgICB9XG4gICAgaWYgKGhvc3QgPT09ICdiaXRidWNrZXQub3JnJykge1xuICAgICAgY29uc3QgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSByZXR1cm4geyBwcm92aWRlcjogJ2JpdGJ1Y2tldCcsIG93bmVyOiBwYXJ0c1swXSwgcmVwbzogcGFydHNbMV0ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKSB9O1xuICAgIH1cbiAgICBpZiAodS5wYXRobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb2RlY29tbWl0JykgfHwgdS5oYXNoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NvZGVjb21taXQnKSB8fCB1LnBhdGhuYW1lLmluY2x1ZGVzKCcvcmVwb3NpdG9yaWVzLycpKSB7XG4gICAgICBjb25zdCBtID0gL3JlcG9zaXRvcig/Onl8aWVzKVxcLyhbXi8jP10rKS8uZXhlYyh1LnBhdGhuYW1lICsgdS5oYXNoKTtcbiAgICAgIGlmIChtKSByZXR1cm4geyBwcm92aWRlcjogJ2NvZGVjb21taXQnLCByZXBvc2l0b3J5TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pIH07XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBub3QgYSBVUkwg4oaSIHVua25vd25cbiAgfVxuICByZXR1cm4geyBwcm92aWRlcjogJ3Vua25vd24nIH07XG59XG5cbmxldCBjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uOiBNYXA8c3RyaW5nLCB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfT4gfCB1bmRlZmluZWQ7XG5pbnRlcmZhY2UgQ29kZUNvbW1pdE1vZHVsZSB7XG4gIENvZGVDb21taXRDbGllbnQ6IG5ldyAoY29uZmlnOiB7IHJlZ2lvbjogc3RyaW5nIH0pID0+IHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9O1xuICBHZXRDb21taXRDb21tYW5kOiBuZXcgKGlucHV0OiB7IHJlcG9zaXRvcnlOYW1lOiBzdHJpbmc7IGNvbW1pdElkOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBjb2RlY29tbWl0TW9kOiBDb2RlQ29tbWl0TW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gY29kZUNvbW1pdENsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8eyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IH0+IHtcbiAgaWYgKCFjb2RlY29tbWl0TW9kKSBjb2RlY29tbWl0TW9kID0gYXdhaXQgbG9hZFNkazxDb2RlQ29tbWl0TW9kdWxlPignQGF3cy1zZGsvY2xpZW50LWNvZGVjb21taXQnKTtcbiAgaWYgKCFjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uKSBjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcCgpO1xuICBsZXQgY2xpZW50ID0gY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBuZXcgY29kZWNvbW1pdE1vZC5Db2RlQ29tbWl0Q2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIGNvZGVjb21taXRDbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKiogRmV0Y2ggKGNhY2hlZCkgYSBzaW5nbGUgQ29kZUNvbW1pdCBjb21taXQncyBkYXRlICsgZmlyc3QgcGFyZW50cyB2aWEgR2V0Q29tbWl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gY29kZUNvbW1pdE1ldGEocmVnaW9uOiBzdHJpbmcsIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsIGNvbW1pdElkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0ZT86IHN0cmluZzsgcGFyZW50cz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2FjaGVkID0gY29tbWl0TWV0YUNhY2hlLmdldChjb21taXRJZCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gIGlmICghY29kZWNvbW1pdE1vZCkgY29kZWNvbW1pdE1vZCA9IGF3YWl0IGxvYWRTZGs8Q29kZUNvbW1pdE1vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlY29tbWl0Jyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNvZGVDb21taXRDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IGNvZGVjb21taXRNb2QuR2V0Q29tbWl0Q29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lLCBjb21taXRJZCB9KSkgYXMge1xuICAgIGNvbW1pdD86IHsgY29tbWl0dGVyPzogeyBkYXRlPzogc3RyaW5nIH07IGF1dGhvcj86IHsgZGF0ZT86IHN0cmluZyB9OyBwYXJlbnRzPzogc3RyaW5nW10gfTtcbiAgfTtcbiAgY29uc3QgY29tbWl0ID0gb3V0LmNvbW1pdDtcbiAgY29uc3QgbWV0YSA9IHsgZGF0ZTogdG9Jc28oY29tbWl0Py5jb21taXR0ZXI/LmRhdGUgPz8gY29tbWl0Py5hdXRob3I/LmRhdGUpLCBwYXJlbnRzOiBjb21taXQ/LnBhcmVudHMgfTtcbiAgY29tbWl0TWV0YUNhY2hlLnNldChjb21taXRJZCwgbWV0YSk7XG4gIHJldHVybiBtZXRhO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29kZUNvbW1pdChyZWdpb246IHN0cmluZywgcmVwb3NpdG9yeU5hbWU6IHN0cmluZywgc2hhOiBzdHJpbmcsIHNpbmNlU2hhPzogc3RyaW5nKTogUHJvbWlzZTxDb21taXRJbmZvPiB7XG4gIGxldCBjdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHNoYTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgbGV0IG9sZGVzdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdHJ1bmNhdGVkID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyA7IGkrKykge1xuICAgIGlmICghY3VyKSBicmVhazsgLy8gcmVhY2hlZCBoaXN0b3J5IHJvb3Qg4oCUIHRoZSB3aG9sZSByYW5nZSBpcyBjb3ZlcmVkXG4gICAgaWYgKHNpbmNlU2hhICYmIGN1ciA9PT0gc2luY2VTaGEpIGJyZWFrOyAvLyByZWFjaGVkIHRoZSBleGNsdXNpdmUgbG93ZXIgYm91bmRcbiAgICBpZiAoaSA+PSBNQVhfQ09NTUlUX1dBTEspIHsgdHJ1bmNhdGVkID0gdHJ1ZTsgYnJlYWs7IH0gLy8gaGl0IHRoZSBjYXAgYmVmb3JlIHRoZSBib3VuZGFyeVxuICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBjb2RlQ29tbWl0TWV0YShyZWdpb24sIHJlcG9zaXRvcnlOYW1lLCBjdXIpO1xuICAgIGlmICghbWV0YT8uZGF0ZSkgYnJlYWs7XG4gICAgY291bnQrKztcbiAgICBvbGRlc3QgPSBtZXRhLmRhdGU7XG4gICAgaWYgKCFzaW5jZVNoYSkgYnJlYWs7IC8vIG5vIHJhbmdlIOKGkiBzaW5nbGUgY29tbWl0XG4gICAgY3VyID0gbWV0YS5wYXJlbnRzPy5bMF07XG4gIH1cbiAgLy8gQSB0cnVuY2F0ZWQgd2FsayB5aWVsZHMgYSBjb21taXQgTkVXRVIgdGhhbiB0aGUgdHJ1ZSBvbGRlc3QtdW5zaGlwcGVkIGNvbW1pdCxcbiAgLy8gd2hpY2ggd291bGQgVU5ERVJTVEFURSBsZWFkIHRpbWUg4oCUIG9taXQgdGhlIGZpZWxkcyBlbnRpcmVseSByYXRoZXIgdGhhbiByZXBvcnQgYVxuICAvLyB3cm9uZyAodG9vLXNtYWxsKSB2YWx1ZS4gUmVwb3J0aW5nIGZhbGxzIGJhY2sgdG8gYHVua25vd25gLlxuICBpZiAodHJ1bmNhdGVkKSByZXR1cm4ge307XG4gIHJldHVybiBvbGRlc3QgPyB7IGNvbW1pdFRpbWVzdGFtcDogb2xkZXN0LCBjb21taXRDb3VudDogY291bnQgfSA6IHt9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlR2l0SHViKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgc2hhOiBzdHJpbmcsIHNpbmNlU2hhOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9yZ0lkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxDb21taXRJbmZvPiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0R2l0SHViVG9rZW4ob3JnSWQpO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyxcbiAgICAnVXNlci1BZ2VudCc6ICdwaXBlbGluZS1idWlsZGVyLWZvcndhcmRlcicsXG4gICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICB9O1xuICBpZiAodG9rZW4pIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICBjb25zdCByYXRlTGltaXRlZCA9IChyOiBSZXNwb25zZSkgPT4gci5zdGF0dXMgPT09IDQwMyB8fCByLnN0YXR1cyA9PT0gNDI5O1xuXG4gIGlmIChzaW5jZVNoYSkge1xuICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vY29tcGFyZS8ke3NpbmNlU2hhfS4uLiR7c2hhfWAsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAocmF0ZUxpbWl0ZWQocikpIHsgc2NtQ29vbGRvd25VbnRpbCA9IERhdGUubm93KCkgKyBTQ01fQ09PTERPV05fTVM7IHJldHVybiB7fTsgfVxuICAgIGlmIChyLm9rKSB7XG4gICAgICBjb25zdCBqID0gYXdhaXQgci5qc29uKCkgYXMgeyBjb21taXRzPzogQXJyYXk8eyBjb21taXQ/OiB7IGNvbW1pdHRlcj86IHsgZGF0ZT86IHN0cmluZyB9OyBhdXRob3I/OiB7IGRhdGU/OiBzdHJpbmcgfSB9IH0+IH07XG4gICAgICBjb25zdCBjb21taXRzID0gQXJyYXkuaXNBcnJheShqLmNvbW1pdHMpID8gai5jb21taXRzIDogW107XG4gICAgICBpZiAoY29tbWl0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdCA9IHRvSXNvKGNvbW1pdHNbMF0/LmNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGNvbW1pdHNbMF0/LmNvbW1pdD8uYXV0aG9yPy5kYXRlKTtcbiAgICAgICAgaWYgKG9sZGVzdCkgcmV0dXJuIHsgY29tbWl0VGltZXN0YW1wOiBvbGRlc3QsIGNvbW1pdENvdW50OiBjb21taXRzLmxlbmd0aCB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gc2luZ2xlLWNvbW1pdCByZXNvbHV0aW9uXG4gIH1cbiAgY29uc3QgcjIgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vY29tbWl0cy8ke3NoYX1gLCB7IGhlYWRlcnMgfSk7XG4gIGlmIChyYXRlTGltaXRlZChyMikpIHsgc2NtQ29vbGRvd25VbnRpbCA9IERhdGUubm93KCkgKyBTQ01fQ09PTERPV05fTVM7IHJldHVybiB7fTsgfVxuICBpZiAocjIub2spIHtcbiAgICBjb25zdCBqID0gYXdhaXQgcjIuanNvbigpIGFzIHsgY29tbWl0PzogeyBjb21taXR0ZXI/OiB7IGRhdGU/OiBzdHJpbmcgfTsgYXV0aG9yPzogeyBkYXRlPzogc3RyaW5nIH0gfSB9O1xuICAgIGNvbnN0IGQgPSB0b0lzbyhqLmNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGouY29tbWl0Py5hdXRob3I/LmRhdGUpO1xuICAgIGlmIChkKSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IGQsIGNvbW1pdENvdW50OiAxIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQml0YnVja2V0KG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgc2hhOiBzdHJpbmcpOiBQcm9taXNlPENvbW1pdEluZm8+IHtcbiAgY29uc3QgciA9IGF3YWl0IGZldGNoV2l0aFRpbWVvdXQoYGh0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8ke293bmVyfS8ke3JlcG99L2NvbW1pdC8ke3NoYX1gLCB7XG4gICAgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6ICdwaXBlbGluZS1idWlsZGVyLWZvcndhcmRlcicsICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgfSk7XG4gIGlmIChyLnN0YXR1cyA9PT0gNDI5KSB7IHNjbUNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgU0NNX0NPT0xET1dOX01TOyByZXR1cm4ge307IH1cbiAgaWYgKHIub2spIHtcbiAgICBjb25zdCBqID0gYXdhaXQgci5qc29uKCkgYXMgeyBkYXRlPzogc3RyaW5nIH07XG4gICAgY29uc3QgZCA9IHRvSXNvKGouZGF0ZSk7XG4gICAgaWYgKGQpIHJldHVybiB7IGNvbW1pdFRpbWVzdGFtcDogZCwgY29tbWl0Q291bnQ6IDEgfTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgY29tbWl0VGltZXN0YW1wYCArIGBjb21taXRDb3VudGAgZm9yIGEgc291cmNlL2RlcGxveSBldmVudCwgaW4tYWNjb3VudCxcbiAqIGJlc3QtZWZmb3J0LiBDb21wdXRlZCBvbmNlIHBlciAocGlwZWxpbmVJZCwgc2hhKTsgYWR2YW5jZXMgdGhlIHBpcGVsaW5lJ3MgcmFuZ2VcbiAqIGJvdW5kYXJ5IG9ubHkgb24gc3VjY2Vzcy4gTmV2ZXIgdGhyb3dzIOKAlCByZXR1cm5zIHt9IG9uIGFueSBmYWlsdXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29tbWl0SW5mbyhwaXBlbGluZUlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcgfCBudWxsLCByZWdpb246IHN0cmluZywgc3JjOiBTb3VyY2VSZWYpOiBQcm9taXNlPENvbW1pdEluZm8+IHtcbiAgaWYgKHNyYy5wcm92aWRlciA9PT0gJ3Vua25vd24nKSByZXR1cm4ge307XG4gIGNvbnN0IHJrZXkgPSBgJHtwaXBlbGluZUlkfXwke3NyYy5zaGF9YDtcbiAgY29uc3QgY2FjaGVkID0gY29tbWl0UmVzdWx0Q2FjaGUuZ2V0KHJrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHByZXYgPSBsYXN0U2hhQnlQaXBlbGluZS5nZXQocGlwZWxpbmVJZCk7XG4gIGNvbnN0IHNpbmNlU2hhID0gcHJldiAmJiBwcmV2ICE9PSBzcmMuc2hhID8gcHJldiA6IHVuZGVmaW5lZDtcblxuICBsZXQgaW5mbzogQ29tbWl0SW5mbyA9IHt9O1xuICB0cnkge1xuICAgIGlmIChzcmMucHJvdmlkZXIgPT09ICdjb2RlY29tbWl0JyAmJiBzcmMucmVwb3NpdG9yeU5hbWUpIHtcbiAgICAgIGluZm8gPSBhd2FpdCByZXNvbHZlQ29kZUNvbW1pdChyZWdpb24sIHNyYy5yZXBvc2l0b3J5TmFtZSwgc3JjLnNoYSwgc2luY2VTaGEpO1xuICAgIH0gZWxzZSBpZiAoc3JjLnByb3ZpZGVyID09PSAnZ2l0aHViJyAmJiBzcmMub3duZXIgJiYgc3JjLnJlcG8pIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IHNjbUNvb2xkb3duVW50aWwpIGluZm8gPSBhd2FpdCByZXNvbHZlR2l0SHViKHNyYy5vd25lciwgc3JjLnJlcG8sIHNyYy5zaGEsIHNpbmNlU2hhLCBvcmdJZCk7XG4gICAgfSBlbHNlIGlmIChzcmMucHJvdmlkZXIgPT09ICdiaXRidWNrZXQnICYmIHNyYy5vd25lciAmJiBzcmMucmVwbykge1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gc2NtQ29vbGRvd25VbnRpbCkgaW5mbyA9IGF3YWl0IHJlc29sdmVCaXRidWNrZXQoc3JjLm93bmVyLCBzcmMucmVwbywgc3JjLnNoYSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignQ29tbWl0IHJlc29sdXRpb24gZmFpbGVkIChvbWl0dGluZyBjb21taXRUaW1lc3RhbXAvY29tbWl0Q291bnQpJywgeyBwcm92aWRlcjogc3JjLnByb3ZpZGVyLCBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgaW5mbyA9IHt9O1xuICB9XG5cbiAgY29tbWl0UmVzdWx0Q2FjaGUuc2V0KHJrZXksIGluZm8pO1xuICBpZiAoaW5mby5jb21taXRUaW1lc3RhbXApIGxhc3RTaGFCeVBpcGVsaW5lLnNldChwaXBlbGluZUlkLCBzcmMuc2hhKTtcbiAgcmV0dXJuIGluZm87XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudCBQYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgUGFyc2VkRXZlbnQge1xuICAvKipcbiAgICogUmVzb2x2ZWQgcGxhdGZvcm0gb3JnSWQgKGZyb20gdGhlIHBpcGVsaW5lJ3MgT3JnSWQgdGFnOyBudWxsIHdoZW4gdW50YWdnZWQpLlxuICAgKiBJTlRFUk5BTCDigJQgdXNlZCBvbmx5IHRvIGtleSB0aGUgcGVyLW9yZyBHaXRIdWIgdG9rZW4gYW5kIHRvIGF0dHJpYnV0ZVxuICAgKiBpbmdlc3QtaGVhbHRoLiBTdHJpcHBlZCBmcm9tIHRoZSBwYXlsb2FkIFBPU1RlZCB0byAvcmVwb3J0cy9ldmVudHMgKHdoaWNoXG4gICAqIHJlc29sdmVzIG9yZyBmcm9tIHRoZSBwaXBlbGluZSByZWdpc3RyeSwgbm90IHRoZSBib2R5KS5cbiAgICovXG4gIG9yZ0lkOiBzdHJpbmcgfCBudWxsO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiBzdHJpbmc7XG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uLCBmcm9tIGFuIEFjdGlvbiBldmVudCdzXG4gICAqICBgZXhlY3V0aW9uLXJlc3VsdC5leHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeWAuIFRoZSBsb2cgVVJMICsgZXJyb3ItY29kZVxuICAgKiAgc3RheSBpbiBgZGV0YWlsYCBmb3IgZHJpbGwtZG93bi4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICAvKiogU291cmNlIGNvbW1pdCBpZCAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiBVbmRlZmluZWQgd2hlbiB0aGUgZXZlbnRcbiAgICogIGNhcnJpZXMgbm8gc291cmNlIHJldmlzaW9uIOKAlCBzdG9yZWQgTlVMTCBkb3duc3RyZWFtLiAqL1xuICBjb21taXRTaGE/OiBzdHJpbmc7XG4gIC8qKiBTb3VyY2UgYnJhbmNoL3JlZiAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiBVbmRlZmluZWQgd2hlbiB1bmF2YWlsYWJsZS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogT2xkZXN0LXVuc2hpcHBlZCBjb21taXQgdGltZXN0YW1wIChJU08gODYwMSkgZm9yIHRoZSByYW5nZSBzaW5jZSB0aGUgbGFzdFxuICAgKiAgZGVwbG95IOKAlCByZXNvbHZlZCBpbi1hY2NvdW50IChQaGFzZSA0KS4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuLyoqIEZpcnN0IG5vbi1lbXB0eSBzdHJpbmcgYW1vbmcgdGhlIGNhbmRpZGF0ZXMsIGNhcHBlZCB0byB0aGUgaW5nZXN0IG1heC4gKi9cbmZ1bmN0aW9uIGZpcnN0QXR0ciguLi52YWxzOiB1bmtub3duW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHYgb2YgdmFscykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwKSByZXR1cm4gdi5zbGljZSgwLCBNQVhfQVRUUik7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBleHRyYWN0aW9uIG9mIHRoZSBzb3VyY2UgY29tbWl0IGlkICsgcmVmIChhbmQgdGhlIHJldmlzaW9uIFVSTCwgdXNlZFxuICogb25seSBpbi1hY2NvdW50IHRvIGNsYXNzaWZ5IHRoZSBzb3VyY2UgdHlwZSBmb3IgY29tbWl0LXJhbmdlIHJlc29sdXRpb24pIGZyb20gYVxuICogQ29kZVBpcGVsaW5lIGV2ZW50IGRldGFpbC4gQ29kZVBpcGVsaW5lIHN1cmZhY2VzIHRoZSBzb3VyY2UgcmV2aXNpb24gdW5kZXIgYSBmZXdcbiAqIHNoYXBlcyBkZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUgLyBzb3VyY2UtYWN0aW9uOyB3ZSBjaGVjayB0aGUga25vd24gb25lcyBhbmRcbiAqIGxlYXZlIHRoZSBmaWVsZHMgdW5kZWZpbmVkIHdoZW4gbm9uZSBhcmUgcHJlc2VudCAoTlVMTCBkb3duc3RyZWFtKS4gTmV2ZXIgcHVsbHMgYW5cbiAqIEFSTi9hY2NvdW50IGlkOiBvbmx5IHJldmlzaW9uL2JyYW5jaC91cmwgc3RyaW5nIGZpZWxkcyBhcmUgcmVhZDsgdGhlIHJldmlzaW9uVXJsXG4gKiBpcyBjb25zdW1lZCBpbi1hY2NvdW50IChzb3VyY2UgY2xhc3NpZmljYXRpb24pIGFuZCBuZXZlciBmb3J3YXJkZWQgb24gaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbW1pdChkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBjb21taXRTaGE/OiBzdHJpbmc7IGNvbW1pdFJlZj86IHN0cmluZzsgcmV2aXNpb25Vcmw/OiBzdHJpbmcgfSB7XG4gIC8vIGBzb3VyY2UtcmV2aXNpb25zYCAoa2ViYWIsIEV2ZW50QnJpZGdlKSAvIGBzb3VyY2VSZXZpc2lvbnNgIChjYW1lbCkg4oCUIGZpcnN0IGVudHJ5LlxuICBjb25zdCByZXZzID0gKGRldGFpbFsnc291cmNlLXJldmlzaW9ucyddID8/IGRldGFpbC5zb3VyY2VSZXZpc2lvbnMpIGFzXG4gICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0UmV2ID0gQXJyYXkuaXNBcnJheShyZXZzKSA/IHJldnNbMF0gOiB1bmRlZmluZWQ7XG4gIC8vIE9uIHNvdXJjZSBhY3Rpb25zIHRoZSByZXZpc2lvbiBpZCBjYW4gYWxzbyByaWRlIG9uIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbW1pdFNoYSA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0SWQsXG4gICAgZGV0YWlsLnJldmlzaW9uSWQsXG4gICAgZmlyc3RSZXY/LnJldmlzaW9uSWQsXG4gICAgZXhlY1Jlc3VsdD8ucmV2aXNpb25JZCxcbiAgKTtcbiAgY29uc3QgY29tbWl0UmVmID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRSZWYsXG4gICAgZGV0YWlsLmJyYW5jaCxcbiAgICBkZXRhaWwuc291cmNlQnJhbmNoLFxuICAgIGZpcnN0UmV2Py5icmFuY2hOYW1lLFxuICAgIGZpcnN0UmV2Py5icmFuY2gsXG4gICk7XG4gIGNvbnN0IHJldmlzaW9uVXJsID0gdHlwZW9mIGZpcnN0UmV2Py5yZXZpc2lvblVybCA9PT0gJ3N0cmluZycgPyBmaXJzdFJldi5yZXZpc2lvblVybCA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLCAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLCAuLi4ocmV2aXNpb25VcmwgJiYgeyByZXZpc2lvblVybCB9KSB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUV2ZW50KGRldGFpbFR5cGU6IHN0cmluZyk6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGV2ZW50U291cmNlOiBzdHJpbmcgfSB7XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdQaXBlbGluZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1N0YWdlIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdTVEFHRScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQWN0aW9uIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdBQ1RJT04nLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLCBzb1xuICAvLyBwYXJzZVJlY29yZCBkcm9wcyB0aGVtIG9uIHRoZSBgZXZlbnRTb3VyY2UgIT09ICdjb2RlcGlwZWxpbmUnYCBjaGVjayBiZWxvdyDigJRcbiAgLy8gdGhlICdCVUlMRCcgZXZlbnRUeXBlIGlzIG5ldmVyIHBlcnNpc3RlZCBoZXJlIChwbHVnaW4gQlVJTEQgZXZlbnRzIGFyZVxuICAvLyByZWNvcmRlZCBkaXJlY3RseSBieSB0aGUgcGx1Z2luIHNlcnZpY2UpLiBUaGUgJ2NvZGVidWlsZCcgc291cmNlIGlzIHdoYXRcbiAgLy8gcm91dGVzIHRoZSBkcm9wOyBrZWVwIHRoaXMgYnJhbmNoIG9ubHkgZm9yIHRoYXQuXG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdCdWlsZCBTdGF0ZScpKSByZXR1cm4geyBldmVudFR5cGU6ICdCVUlMRCcsIGV2ZW50U291cmNlOiAnY29kZWJ1aWxkJyB9O1xuICByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xufVxuXG4vKiogUGFyc2UgKyByZXNvbHZlIG9uZSByZWNvcmQgdG8gYSByZXBvcnRhYmxlIGV2ZW50LCBvciBudWxsIHRvIHNraXAgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwYXJzZVJlY29yZChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8UGFyc2VkRXZlbnQgfCBudWxsPiB7XG4gIGxldCBldmVudDoge1xuICAgICdkZXRhaWwtdHlwZSc6IHN0cmluZztcbiAgICAnc291cmNlJzogc3RyaW5nO1xuICAgICdkZXRhaWwnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAndGltZSc6IHN0cmluZztcbiAgICAncmVnaW9uJzogc3RyaW5nO1xuICAgICdhY2NvdW50Jzogc3RyaW5nO1xuICB9O1xuICAvLyBBIG1hbGZvcm1lZCBib2R5IGlzIGEgZGVhZCBtZXNzYWdlIChyZXRyeWluZyB3b24ndCBoZWxwKSDigJQgbG9nICsgc2tpcCBpdCBzb1xuICAvLyBpdCBjYW4ndCBmYWlsIHRoZSB3aG9sZSBiYXRjaC4gUmVzb2x1dGlvbiBlcnJvcnMgYmVsb3cgKGUuZy4gQWNjZXNzRGVuaWVkKVxuICAvLyBhcmUgTk9UIGNhdWdodCBoZXJlOiB0aG9zZSBhcmUgdHJhbnNpZW50L2luZnJhIGFuZCBtdXN0IHByb3BhZ2F0ZSB0byByZXRyeS5cbiAgdHJ5IHtcbiAgICBldmVudCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgU1FTIHJlY29yZCB3aXRoIHVucGFyc2VhYmxlIGJvZHknLCB7IG1lc3NhZ2VJZDogcmVjb3JkLm1lc3NhZ2VJZCwgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBldmVudFR5cGUsIGV2ZW50U291cmNlIH0gPSBjbGFzc2lmeUV2ZW50KGV2ZW50WydkZXRhaWwtdHlwZSddKTtcbiAgY29uc3QgZGV0YWlsID0geyAuLi5ldmVudC5kZXRhaWwgfTtcbiAgLy8gVGhlIHJhdyBhY2NvdW50IG5ldmVyIG5lZWRzIHRvIGxlYXZlIEFXUyBub3cg4oCUIGRyb3AgaXQgZnJvbSB0aGUgcGF5bG9hZC5cbiAgZGVsZXRlIGRldGFpbC5hY2NvdW50O1xuXG4gIC8vIENvZGVCdWlsZCBcIkJ1aWxkIFN0YXRlXCIgZXZlbnRzIGlkZW50aWZ5IGEgYnVpbGQgKnByb2plY3QqLCBub3QgYSBwaXBlbGluZSxcbiAgLy8gYW5kIGEgcHJvamVjdCBjYW4gYmUgc2hhcmVkIGFjcm9zcyBwaXBlbGluZXMg4oCUIHRoZXJlJ3Mgbm8gY2xlYW4gMToxIG1hcHBpbmdcbiAgLy8gdG8gYSBwaXBlbGluZSBpZCwgc28gc2tpcCB0aGVtLlxuICBpZiAoZXZlbnRTb3VyY2UgIT09ICdjb2RlcGlwZWxpbmUnKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIG5vbi1Db2RlUGlwZWxpbmUgZXZlbnQgKG5vIHBpcGVsaW5lIHRhZyB0byByZXNvbHZlKScsIHsgZGV0YWlsVHlwZTogZXZlbnRbJ2RldGFpbC10eXBlJ10gfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwaXBlbGluZU5hbWUgPSBkZXRhaWwucGlwZWxpbmUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoIXBpcGVsaW5lTmFtZSkge1xuICAgIGxvZy53YXJuKCdDb2RlUGlwZWxpbmUgZXZlbnQgbWlzc2luZyBwaXBlbGluZSBuYW1lIOKAlCBza2lwcGluZycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gUmVzb2x2ZSB0aGUgcGlwZWxpbmUncyBwYi5waXBlbGluZS1pZCAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKSArIHBiLmRlcGxveXMgbWFwLlxuICAvLyBUaGUgQVJOIGlzIG9ubHkgYSB0cmFuc2llbnQgaGFuZGxlIGZvciB0aGUgdGFnIGxvb2t1cDsgaXQgaXMgbmV2ZXIgc3RvcmVkLlxuICBjb25zdCBhcm4gPSBgYXJuOmF3czpjb2RlcGlwZWxpbmU6JHtldmVudC5yZWdpb259OiR7ZXZlbnQuYWNjb3VudH06JHtwaXBlbGluZU5hbWV9YDtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBvcmdJZCwgZGVwbG95cyB9ID0gYXdhaXQgcmVzb2x2ZVBpcGVsaW5lKGFybiwgZXZlbnQucmVnaW9uKTtcbiAgaWYgKCFwaXBlbGluZUlkKSByZXR1cm4gbnVsbDsgLy8gdW50YWdnZWQgLyB1bnJlZ2lzdGVyZWQg4oaSIHNraXBcblxuICBjb25zdCBzdGFydGVkQXQgPSAoZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nKSB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIGlmIChzdGFydGVkQXQgJiYgY29tcGxldGVkQXQpIHtcbiAgICAgIGNvbnN0IG1zID0gbmV3IERhdGUoY29tcGxldGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKG1zID49IDApIGR1cmF0aW9uTXMgPSBtcztcbiAgICB9XG4gIH1cblxuICAvLyBQcm9tb3RlIHRoZSBmYWlsdXJlIHJlYXNvbiB0byBhIHR5cGVkIGZpZWxkLiBPbiBBY3Rpb24gZXZlbnRzIEFXUyBwdXRzIHRoZVxuICAvLyBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IChhbmQgYSBsb2cgVVJMICsgZXJyb3ItY29kZSwgd2hpY2ggc3RheSBpbiBgZGV0YWlsYClcbiAgLy8gdW5kZXIgYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCByZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyB7ICdleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSc/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1bW1hcnkgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknXTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBET1JBIGRlcGxveSBhdHRyaWJ1dGlvbiDigJQgYWxsIG9wdGlvbmFsOiBvbWl0dGVkICh1bmRlZmluZWQpIHdoZW4gdGhlXG4gIC8vIGV2ZW50L3BpcGVsaW5lIGRvZXNuJ3QgY2FycnkgdGhlbS5cbiAgY29uc3QgeyBjb21taXRTaGEsIGNvbW1pdFJlZiwgcmV2aXNpb25VcmwgfSA9IGV4dHJhY3RDb21taXQoZGV0YWlsKTtcblxuICBjb25zdCBleGVjdXRpb25JZCA9IGRldGFpbFsnZXhlY3V0aW9uLWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdGFnZU5hbWUgPSBkZXRhaWwuc3RhZ2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3Rpb25OYW1lID0gZGV0YWlsLmFjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRW52aXJvbm1lbnQgKOKHkiBpc0RlcGxveSkgaXMgc2V0IE9OTFkgd2hlbiB0aGlzIGV2ZW50J3Mgc3RhZ2UgaXMgbGlzdGVkIGluIHRoZVxuICAvLyBwaXBlbGluZSdzIHBiLmRlcGxveXMgdGFnLiBQSVBFTElORSBldmVudHMgaGF2ZSBubyBzdGFnZSDihpIgbmV2ZXIgYSBkZXBsb3kuXG4gIGNvbnN0IGVudmlyb25tZW50ID0gc3RhZ2VOYW1lID8gZGVwbG95cy5nZXQoc3RhZ2VOYW1lKSA6IHVuZGVmaW5lZDtcblxuICAvLyBQaGFzZSA0IOKAlCByZXNvbHZlIHRoZSBjb21taXQgcmFuZ2UgKG9sZGVzdC11bnNoaXBwZWQgdGltZXN0YW1wICsgY291bnQpIGZvciBhbnlcbiAgLy8gZXZlbnQgY2FycnlpbmcgYSBjb21taXQuIEJlc3QtZWZmb3J0L2luLWFjY291bnQ7IG9taXR0ZWQgb24gYW55IGZhaWx1cmUuXG4gIC8vIEdBVEVEIG9uIGBET1JBX0VOQUJMRURgIChzZXQgYnkgYHNldHVwLWV2ZW50cyAtLXdpdGgtZG9yYWApOiBET1JBIGxlYWQgdGltZSBpcyBhblxuICAvLyBhZHZhbmNlZF9yZXBvcnRpbmcgYWRkLW9uLCBzbyBvcmdzIHdpdGhvdXQgaXQgc2tpcCB0aGUgU0NNL3NlY3JldCBjb3N0IGVudGlyZWx5IOKAlFxuICAvLyBzdGFuZGFyZCByZXBvcnRpbmcgKGNvbW1pdFNoYSArIGFsbCBvdGhlciBmaWVsZHMpIHN0aWxsIGZvcndhcmRzIHJlZ2FyZGxlc3MuXG4gIGxldCBjb21taXRUaW1lc3RhbXA6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbW1pdENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmIChjb21taXRTaGEgJiYgcHJvY2Vzcy5lbnYuRE9SQV9FTkFCTEVEID09PSAndHJ1ZScpIHtcbiAgICBjb25zdCBzcmMgPSBjbGFzc2lmeVNvdXJjZShyZXZpc2lvblVybCk7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHJlc29sdmVDb21taXRJbmZvKHBpcGVsaW5lSWQsIG9yZ0lkLCBldmVudC5yZWdpb24sIHsgc2hhOiBjb21taXRTaGEsIC4uLnNyYyB9KTtcbiAgICBjb21taXRUaW1lc3RhbXAgPSBpbmZvLmNvbW1pdFRpbWVzdGFtcDtcbiAgICBjb21taXRDb3VudCA9IGluZm8uY29tbWl0Q291bnQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9yZ0lkLFxuICAgIHBpcGVsaW5lSWQsXG4gICAgZXZlbnRTb3VyY2UsXG4gICAgZXZlbnRUeXBlLFxuICAgIHN0YXR1czogc3RhdGUsXG4gICAgZXhlY3V0aW9uSWQsXG4gICAgc3RhZ2VOYW1lLFxuICAgIGFjdGlvbk5hbWUsXG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIHN0YXJ0ZWRBdCxcbiAgICBjb21wbGV0ZWRBdCxcbiAgICBkdXJhdGlvbk1zLFxuICAgIC4uLihjb21taXRTaGEgJiYgeyBjb21taXRTaGEgfSksXG4gICAgLi4uKGNvbW1pdFJlZiAmJiB7IGNvbW1pdFJlZiB9KSxcbiAgICAuLi4oY29tbWl0VGltZXN0YW1wICYmIHsgY29tbWl0VGltZXN0YW1wIH0pLFxuICAgIC4uLihjb21taXRDb3VudCAmJiB7IGNvbW1pdENvdW50IH0pLFxuICAgIC4uLihlbnZpcm9ubWVudCAmJiB7IGVudmlyb25tZW50IH0pLFxuICAgIGRldGFpbCxcbiAgfTtcbn1cblxuLy8g4pSA4pSA4pSAIFBoYXNlIDM6IGRlbGl2ZXJ5IGhlYWx0aCArIHNlbGYtaGVhbGluZyBETFEgcmVkcml2ZSDilIBcbi8vIEFmdGVyIGEgU1VDQ0VTU0ZVTCBiYXRjaCBQT1NUIHdlICh0aHJvdHRsZWQsIGJlc3QtZWZmb3J0KTpcbi8vICAgMS4gUE9TVCBhbiBpbmdlc3QtaGVhbHRoIHNpZ25hbCB0byAvYXBpL3JlcG9ydHMvaW5nZXN0LWhlYWx0aCBzbyB0aGUgUmVwb3J0cyBVSVxuLy8gICAgICBjYW4gc2hvdyBmbG93aW5nIC8gc3RhbGUgLyBkcm9wcGluZy5cbi8vICAgMi4gSWYgdGhlIERMUSBpcyBub24tZW1wdHksIG5vIG1vdmUgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcsIEFORCB0aGUgb2xkZXN0IERMUVxuLy8gICAgICBtZXNzYWdlIGlzIHlvdW5nZXIgdGhhbiB0aGUgcG9pc29uLWFnZSBjZWlsaW5nLCBraWNrIG9mZiBhbiBTUVNcbi8vICAgICAgTWVzc2FnZU1vdmVUYXNrIChETFEg4oaSIG1haW4gcXVldWUpIHNvIHJldHJ5YWJsZSBmYWlsdXJlcyBzZWxmLWhlYWwgd2l0aG91dCBhXG4vLyAgICAgIG5ldyBBV1Mgc2VydmljZS4gVGhlIHJlcG9ydGluZyBpbmdlc3QncyBwYXJ0aWFsLXVuaXF1ZSBpbmRleCBkZWR1cGVzIGFueVxuLy8gICAgICByZWRlbGl2ZXJlZCBldmVudCwgc28gYSByZWRyaXZlIGNhbid0IGRvdWJsZS1jb3VudC5cbi8vIEd1YXJkczogb25seSBvbiBzdWNjZXNzLCBvbmUtYXQtYS10aW1lIChMaXN0TWVzc2FnZU1vdmVUYXNrcyksIGEgcG9pc29uLWFnZSBjZWlsaW5nXG4vLyAoc28gYSBtZXNzYWdlIHRoYXQgYWx3YXlzIGZhaWxzIGNhbid0IGxvb3AgRExR4oaSbWFpbuKGkkRMUSBmb3JldmVyKSwgYW5kIHRocm90dGxlZCB2aWFcbi8vIG1vZHVsZSB0aW1lc3RhbXBzLiBORVZFUiB0aHJvd3Mg4oCUIGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGJhdGNoLlxuLy9cbi8vIElBTSByZXF1aXJlZCAoZG9jdW1lbnQgb25seSDigJQgZ3JhbnRlZCBvbiB0aGUgZXZlbnRzIHN0YWNrKTpcbi8vICAgc3FzOkdldFF1ZXVlQXR0cmlidXRlcywgc3FzOkxpc3RNZXNzYWdlTW92ZVRhc2tzLCBzcXM6U3RhcnRNZXNzYWdlTW92ZVRhc2sgKG9uIHRoZSBETFEpXG5cbmludGVyZmFjZSBTcXNDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9XG5pbnRlcmZhY2UgU3FzTW9kdWxlIHtcbiAgU1FTQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBTcXNDbGllbnRMaWtlO1xuICBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kOiBuZXcgKGlucHV0OiB7IFF1ZXVlVXJsOiBzdHJpbmc7IEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSB9KSA9PiB1bmtub3duO1xuICBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgU291cmNlQXJuOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbiAgU3RhcnRNZXNzYWdlTW92ZVRhc2tDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nOyBEZXN0aW5hdGlvbkFybj86IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IHNxc01vZDogU3FzTW9kdWxlIHwgdW5kZWZpbmVkO1xubGV0IHNxc0NsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgU3FzQ2xpZW50TGlrZT4gfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBzcXNDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFNxc0NsaWVudExpa2U+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBpZiAoIXNxc0NsaWVudHNCeVJlZ2lvbikgc3FzQ2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcCgpO1xuICBsZXQgY2xpZW50ID0gc3FzQ2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IG5ldyBzcXNNb2QuU1FTQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHNxc0NsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8vIERlbGl2ZXJ5LWhlYWx0aCBjb3VudGVycyBhcmUgYXR0cmlidXRlZCBQRVIgUkVTT0xWRUQgT1JHICh0aGUgZm9yd2FyZGVyIGlzIGEgZmxlZXRcbi8vIExhbWJkYSBzZXJ2aW5nIG1hbnkgb3JnczsgYSBzaW5nbGUgZ2xvYmFsIGNvdW50ZXIgd291bGQgbWlzLWF0dHJpYnV0ZSBvbmUgb3JnJ3Ncbi8vIHRocm91Z2hwdXQgdG8gYW5vdGhlcikuIEtleWVkIGJ5IG9yZ0lkICgnJyBidWNrZXQgPSBwaXBlbGluZSB3aXRoIG5vIE9yZ0lkIHRhZykuXG4vLyBUaGUgRExRIGRlcHRoIChgZHJvcHBlZGApIGlzIGdlbnVpbmVseSBmbGVldC1nbG9iYWwg4oCUIG9uZSBzaGFyZWQgRExRIOKAlCBzbyBpdCBpcyBhXG4vLyBzaW5nbGUgc25hcHNob3QgcG9zdGVkIGFsb25nc2lkZSBlYWNoIG9yZydzIGhlYWx0aCwgZG9jdW1lbnRlZCBhcyB0aGUgc2hhcmVkIGRlcHRoLlxuY29uc3QgZm9yd2FyZGVkQnlPcmcgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuY29uc3QgbGFzdEV2ZW50QXRCeU9yZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5sZXQgbGFzdEhlYWx0aEF0ID0gMDtcbmxldCBsYXN0UmVkcml2ZUF0ID0gMDtcbmNvbnN0IEhFQUxUSF9USFJPVFRMRV9NUyA9IDYwICogMTAwMDtcbmNvbnN0IFJFRFJJVkVfVEhST1RUTEVfTVMgPSA1ICogNjAgKiAxMDAwO1xuLy8gUG9pc29uLW1lc3NhZ2UgY2VpbGluZzogaWYgdGhlIG9sZGVzdCBETFEgbWVzc2FnZSBpcyBvbGRlciB0aGFuIHRoaXMsIHdlIFNUT1Bcbi8vIHJlZHJpdmluZyBpdCAoRExR4oaSbWFpbuKGkmZhaWzihpJETFEgd291bGQgbG9vcCBmb3JldmVyKS4gU3VjaCBtZXNzYWdlcyBhcmUgbGVmdCBmb3IgYW5cbi8vIGFsYXJtIC8gbWFudWFsIGluc3BlY3Rpb24gaW5zdGVhZCBvZiBjaHVybmluZyB0aGUgZmxlZXQgaW5kZWZpbml0ZWx5LlxuY29uc3QgTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMgPSA2ICogNjAgKiA2MDsgLy8gNiBob3Vyc1xuXG4vKiogUGFyc2UgdGhlIFNRUyB0cmlnZ2VyIEFSTiBhbmQgZGVyaXZlIHRoZSBtYWluICsgRExRIEFSTnMgYW5kIHRoZSBETFEgVVJMLiAqL1xuZnVuY3Rpb24gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyByZWdpb246IHN0cmluZzsgbWFpbkFybjogc3RyaW5nOyBkbHFBcm46IHN0cmluZzsgZGxxVXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghbWFpblF1ZXVlQXJuKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBhcm46YXdzOnNxczp7cmVnaW9ufTp7YWNjb3VudH06e25hbWV9XG4gIGNvbnN0IHBhcnRzID0gbWFpblF1ZXVlQXJuLnNwbGl0KCc6Jyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPCA2IHx8IHBhcnRzWzJdICE9PSAnc3FzJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgWywgLCAsIHJlZ2lvbiwgYWNjb3VudCwgbmFtZV0gPSBwYXJ0cztcbiAgY29uc3QgZGxxQXJuID0gcHJvY2Vzcy5lbnYuRVZFTlRfRExRX0FSTiB8fCBgYXJuOmF3czpzcXM6JHtyZWdpb259OiR7YWNjb3VudH06JHtuYW1lfS1kbHFgO1xuICBjb25zdCBkbHFOYW1lID0gZGxxQXJuLnNwbGl0KCc6JykucG9wKCkgPz8gYCR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxVXJsID0gYGh0dHBzOi8vc3FzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tLyR7YWNjb3VudH0vJHtkbHFOYW1lfWA7XG4gIHJldHVybiB7IHJlZ2lvbiwgbWFpbkFybjogbWFpblF1ZXVlQXJuLCBkbHFBcm4sIGRscVVybCB9O1xufVxuXG4vKiogU25hcHNob3QgdGhlIERMUSBkZXB0aCArIHRoZSBhZ2UgKHNlY29uZHMpIG9mIGl0cyBvbGRlc3QgbWVzc2FnZSAoZm9yIHRoZVxuICogIHBvaXNvbi1tZXNzYWdlIHJlZHJpdmUgY2VpbGluZykuIE1pc3NpbmcvTmFOIGF0dHJpYnV0ZXMgZmFsbCBiYWNrIHRvIDAuICovXG5hc3luYyBmdW5jdGlvbiBkbHFTdGF0cyhyZWdpb246IHN0cmluZywgZGxxVXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVwdGg6IG51bWJlcjsgb2xkZXN0QWdlU2VjOiBudW1iZXIgfT4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkdldFF1ZXVlQXR0cmlidXRlc0NvbW1hbmQoe1xuICAgIFF1ZXVlVXJsOiBkbHFVcmwsXG4gICAgQXR0cmlidXRlTmFtZXM6IFsnQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJywgJ0FwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlJ10sXG4gIH0pKSBhcyB7IEF0dHJpYnV0ZXM/OiB7IEFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcz86IHN0cmluZzsgQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2U/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBuID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXMgPz8gJzAnKTtcbiAgY29uc3QgYWdlID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSA/PyAnMCcpO1xuICByZXR1cm4ge1xuICAgIGRlcHRoOiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogMCxcbiAgICBvbGRlc3RBZ2VTZWM6IE51bWJlci5pc0Zpbml0ZShhZ2UpID8gYWdlIDogMCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQWN0aXZlTW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgc3FzQ2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBzcXNNb2QuTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kKHsgU291cmNlQXJuOiBkbHFBcm4gfSkpIGFzIHtcbiAgICBSZXN1bHRzPzogQXJyYXk8eyBTdGF0dXM/OiBzdHJpbmcgfT47XG4gIH07XG4gIHJldHVybiAob3V0LlJlc3VsdHMgPz8gW10pLnNvbWUodCA9PiB0LlN0YXR1cyA9PT0gJ1JVTk5JTkcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNb3ZlVGFzayhyZWdpb246IHN0cmluZywgZGxxQXJuOiBzdHJpbmcsIG1haW5Bcm46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLlN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuLCBEZXN0aW5hdGlvbkFybjogbWFpbkFybiB9KSk7XG59XG5cbi8qKiBQT1NUIG9uZSBvcmcncyBpbmdlc3QtaGVhbHRoIHNpZ25hbC4gUmV0dXJucyB0cnVlIG9ubHkgb24gYSBjb25maXJtZWQgMnh4IHNvIHRoZVxuICogIGNhbGxlciByZXNldHMgdGhhdCBvcmcncyBgZm9yd2FyZGVkYCBjb3VudGVyIE9OTFkgd2hlbiB0aGUgc2lnbmFsIHdhcyBhY2NlcHRlZFxuICogIChhIGRyb3BwZWQvZmFpbGVkIFBPU1QgbXVzdCBub3Qgc2lsZW50bHkgemVybyB0aGUgYWNjdW11bGF0ZWQgY291bnQpLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEluZ2VzdEhlYWx0aChiYXNlVXJsOiBzdHJpbmcsIGJvZHk6IHsgb3JnSWQ/OiBzdHJpbmc7IGZvcndhcmRlZDogbnVtYmVyOyBkcm9wcGVkOiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgcmV0dXJuZWQgbm9uLTJ4eCAoaWdub3JlZCknLCB7IHN0YXR1czogcmVzLnN0YXR1cywgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaW5nZXN0LWhlYWx0aCBQT1NUIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSwgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3R0bGVkLCBiZXN0LWVmZm9ydCBwb3N0LXN1Y2Nlc3Mgd29yazogZW1pdCBwZXItb3JnIGluZ2VzdC1oZWFsdGggYW5kIHNlbGYtaGVhbFxuICogdGhlIERMUS4gTmV2ZXIgdGhyb3dzLiBgZm9yd2FyZGVkYC9gbGFzdEV2ZW50QXRgIGFjY3VtdWxhdGUgUEVSIE9SRyBhY3Jvc3MgYmF0Y2hlc1xuICogYmV0d2VlbiBoZWFsdGggcG9zdHM7IGBkcm9wcGVkYCBpcyB0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCBzbmFwc2hvdC4gQSBwZXItb3JnXG4gKiBjb3VudGVyIGlzIHplcm9lZCBvbmx5IGFmdGVyIHRoYXQgb3JnJ3MgaGVhbHRoIFBPU1QgaXMgY29uZmlybWVkIDJ4eC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwb3J0SGVhbHRoQW5kUmVkcml2ZShiYXNlVXJsOiBzdHJpbmcsIG1haW5RdWV1ZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmIChub3cgLSBsYXN0SGVhbHRoQXQgPCBIRUFMVEhfVEhST1RUTEVfTVMpIHJldHVybjtcbiAgbGFzdEhlYWx0aEF0ID0gbm93O1xuICB0cnkge1xuICAgIGNvbnN0IHEgPSBkZXJpdmVRdWV1ZXMobWFpblF1ZXVlQXJuKTtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBvbGRlc3RBZ2VTZWMgPSAwO1xuICAgIGlmIChxKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGRscVN0YXRzKHEucmVnaW9uLCBxLmRscVVybCk7XG4gICAgICAgIGRlcHRoID0gc3RhdHMuZGVwdGg7XG4gICAgICAgIG9sZGVzdEFnZVNlYyA9IHN0YXRzLm9sZGVzdEFnZVNlYztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cud2FybignRExRIHN0YXRzIGNoZWNrIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQb3N0IG9uZSBoZWFsdGggc2lnbmFsIHBlciByZXNvbHZlZCBvcmcsIGF0dHJpYnV0aW5nIGl0cyBvd24gZm9yd2FyZGVkIGNvdW50ICtcbiAgICAvLyBsYXN0IGV2ZW50IHRpbWUuIGBkcm9wcGVkYCAodGhlIHNoYXJlZCBmbGVldCBETFEgZGVwdGgpIHJpZGVzIGFsb25nIG9uIGVhY2guXG4gICAgLy8gU25hcHNob3QgdGhlIGtleXMgZmlyc3Qgc28gd2UgZG9uJ3QgbXV0YXRlIHRoZSBtYXAgd2hpbGUgaXRlcmF0aW5nLlxuICAgIGNvbnN0IG9yZ0tleXMgPSBuZXcgU2V0KFsuLi5mb3J3YXJkZWRCeU9yZy5rZXlzKCksIC4uLmxhc3RFdmVudEF0QnlPcmcua2V5cygpXSk7XG4gICAgaWYgKG9yZ0tleXMuc2l6ZSA9PT0gMCkgb3JnS2V5cy5hZGQoJycpOyAvLyBub3RoaW5nIGZvcndhcmRlZCB5ZXQg4oaSIHN0aWxsIHJlcG9ydCBkZXB0aFxuICAgIGZvciAoY29uc3Qga2V5IG9mIG9yZ0tleXMpIHtcbiAgICAgIGNvbnN0IGZvcndhcmRlZCA9IGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDA7XG4gICAgICBjb25zdCBsYXN0RXZlbnRBdCA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBjb25zdCBvayA9IGF3YWl0IHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybCwge1xuICAgICAgICAuLi4oa2V5ID8geyBvcmdJZDoga2V5IH0gOiB7fSksXG4gICAgICAgIGZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogZGVwdGgsXG4gICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgfSk7XG4gICAgICAvLyBSZXNldCB0aGUgZm9yd2FyZGVkIGNvdW50ZXIgT05MWSBvbiBhIGNvbmZpcm1lZCAyeHgg4oCUIGEgZmFpbGVkL2Ryb3BwZWQgUE9TVFxuICAgICAgLy8ga2VlcHMgdGhlIGNvdW50IHNvIHRoZSBuZXh0IHRpY2sgcmUtcmVwb3J0cyBpdCBpbnN0ZWFkIG9mIGxvc2luZyBpdC5cbiAgICAgIGlmIChvaykgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgMCk7XG4gICAgfVxuXG4gICAgaWYgKHEgJiYgZGVwdGggPiAwICYmIG5vdyAtIGxhc3RSZWRyaXZlQXQgPj0gUkVEUklWRV9USFJPVFRMRV9NUykge1xuICAgICAgLy8gUG9pc29uLW1lc3NhZ2UgY2VpbGluZzogbmV2ZXIgcmVkcml2ZSBhIERMUSB3aG9zZSBvbGRlc3QgbWVzc2FnZSBoYXMgYWdlZFxuICAgICAgLy8gcGFzdCB0aGUgY2VpbGluZyDigJQgdGhhdCBtZXNzYWdlIGtlZXBzIGZhaWxpbmcgYW5kIHdvdWxkIGxvb3AgRExR4oaSbWFpbuKGkkRMUS5cbiAgICAgIGlmIChvbGRlc3RBZ2VTZWMgPiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQykge1xuICAgICAgICBsb2cud2FybignRExRIG9sZGVzdCBtZXNzYWdlIGV4Y2VlZHMgcG9pc29uLWFnZSBjZWlsaW5nIOKAlCBza2lwcGluZyByZWRyaXZlIChuZWVkcyBtYW51YWwgYXR0ZW50aW9uKScsIHtcbiAgICAgICAgICBkbHFBcm46IHEuZGxxQXJuLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjLCBjZWlsaW5nU2VjOiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghKGF3YWl0IGhhc0FjdGl2ZU1vdmVUYXNrKHEucmVnaW9uLCBxLmRscUFybikpKSB7XG4gICAgICAgICAgICBsYXN0UmVkcml2ZUF0ID0gbm93O1xuICAgICAgICAgICAgYXdhaXQgc3RhcnRNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4sIHEubWFpbkFybik7XG4gICAgICAgICAgICBsb2cuaW5mbygnU3RhcnRlZCBzZWxmLWhlYWxpbmcgRExR4oaSbWFpbiByZWRyaXZlJywgeyBkbHFBcm46IHEuZGxxQXJuLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLndhcm4oJ0RMUSByZWRyaXZlIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ2hlYWx0aC9yZWRyaXZlIHN0ZXAgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgCBIYW5kbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogU1FTRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgYmFzZVVybCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMO1xuICBpZiAoIWJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBQYXJzZSArIHJlc29sdmUgYWxsIHJlY29yZHMgKHRhZyArIGNvbW1pdCBsb29rdXBzIHJ1biBjb25jdXJyZW50bHkpOyBkcm9wXG4gIC8vIGludGVudGlvbmFsIHNraXBzIChudWxsKS4gQSBtYWxmb3JtZWQgcmVjb3JkIEJPRFkgaXMgaGFuZGxlZCBpbnNpZGUgcGFyc2VSZWNvcmRcbiAgLy8gKGxvZ2dlZCArIHNraXBwZWQpIHNvIG9uZSBiYWQgbWVzc2FnZSBjYW4ndCBmYWlsIHRoZSB3aG9sZSBiYXRjaCDigJQgd2hpbGUgZ2VudWluZVxuICAvLyBpbmZyYSBlcnJvcnMgKGUuZy4gQWNjZXNzRGVuaWVkIG9uIHRoZSB0YWcgbG9va3VwKSBzdGlsbCBwcm9wYWdhdGUgc28gYSBtaXNzaW5nXG4gIC8vIElBTSBncmFudCBzdXJmYWNlcyBhbmQgU1FTIHJldHJpZXMgdGhlIGJhdGNoLlxuICBjb25zdCBldmVudHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZXZlbnQuUmVjb3Jkcy5tYXAocGFyc2VSZWNvcmQpKSlcbiAgICAuZmlsdGVyKChlKTogZSBpcyBQYXJzZWRFdmVudCA9PiBlICE9PSBudWxsKTtcbiAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2cuaW5mbygnTm8gcmVzb2x2YWJsZSBDb2RlUGlwZWxpbmUgZXZlbnRzIGluIGJhdGNoJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUE9TVCBiYXRjaCB0byByZXBvcnRpbmcgc2VydmljZS4gT24gYSA0MDEvNDAzIHRoZSBjcmVkZW50aWFsIHRoaXMgY29udGFpbmVyXG4gIC8vIGhvbGRzIGlzIHN0YWxlIOKAlCBtb3N0IG9mdGVuIGJlY2F1c2UgdGhlIHRva2VuLXJlbmV3IExhbWJkYSByb3RhdGVkIHRoZSBrZXkgaW5cbiAgLy8gU2VjcmV0cyBNYW5hZ2VyIOKAlCBzbyBkcm9wIEJPVEggdGhlIGNhY2hlZCB0b2tlbiBhbmQgdGhlIGNhY2hlZCBrZXksIHJlLXJlYWQsXG4gIC8vIGFuZCByZXRyeSBPTkNFLiBgb3JnSWRgIGlzIElOVEVSTkFMICh0b2tlbi9oZWFsdGgga2V5aW5nKSDigJQgc3RyaXAgaXQgaGVyZSBzb1xuICAvLyBpdCBuZXZlciByaWRlcyB0aGUgd2lyZTsgdGhlIGluZ2VzdCByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksXG4gIC8vIG5vdCB0aGUgYm9keS5cbiAgY29uc3QgcGF5bG9hZEV2ZW50cyA9IGV2ZW50cy5tYXAoKHsgb3JnSWQ6IF9vcmdJZCwgLi4ucmVzdCB9KSA9PiByZXN0KTtcbiAgY29uc3QgcG9zdCA9ICh0b2tlbjogc3RyaW5nKSA9PiBmZXRjaChgJHtiYXNlVXJsfS9hcGkvcmVwb3J0cy9ldmVudHNgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHM6IHBheWxvYWRFdmVudHMgfSksXG4gIH0pO1xuICBsZXQgcmVzID0gYXdhaXQgcG9zdChhd2FpdCBnZXRBdXRoVG9rZW4oKSk7XG4gIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgbG9nLndhcm4oJ1JlcG9ydGluZyBBUEkgYXV0aCBmYWlsZWQ7IHJlLXJlYWRpbmcgdGhlIHN0b3JlZCBrZXkgYW5kIHJldHJ5aW5nIG9uY2UnLCB7IHN0YXR1czogcmVzLnN0YXR1cyB9KTtcbiAgICBpbnZhbGlkYXRlQ3JlZGVudGlhbCgpO1xuICAgIHJlcyA9IGF3YWl0IHBvc3QoYXdhaXQgZ2V0QXV0aFRva2VuKCkpO1xuICB9XG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gICAgbG9nLmVycm9yKGBSZXBvcnRpbmcgQVBJIHJldHVybmVkICR7cmVzLnN0YXR1c31gLCB7IGJvZHkgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvcnRpbmcgQVBJIGZhaWxlZDogJHtyZXMuc3RhdHVzfWApO1xuICB9XG5cbiAgLy8gVGhlIGluc2VydCBhbHJlYWR5IHN1Y2NlZWRlZCAoMnh4KS4gVGhlIHBhcnNlZCBib2R5IGlzIG9ubHkgdXNlZCBmb3IgYSBsb2dcbiAgLy8gbGluZSwgc28gYSBub24tSlNPTi9lbXB0eSBib2R5IG11c3Qgbm90IHRocm93IGFuZCBmYWlsIHRoZSB3aG9sZSBiYXRjaCDigJRcbiAgLy8gdGhhdCB3b3VsZCB0cmlnZ2VyIGFuIFNRUyByZWRlbGl2ZXJ5IGFuZCByZS1QT1NUIChkdXBsaWNhdGUpIGFscmVhZHktaW5zZXJ0ZWRcbiAgLy8gZXZlbnRzLiBUaGUgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcywgYnV0IGF2b2lkIHRoZSBjaHVybiBhbnl3YXkuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xuXG4gIC8vIEFjY3VtdWxhdGUgZGVsaXZlcnktaGVhbHRoIGNvdW50ZXJzIFBFUiBSRVNPTFZFRCBPUkcsIHRoZW4gcnVuIHRoZSB0aHJvdHRsZWRcbiAgLy8gcG9zdC1zdWNjZXNzIGhlYWx0aCArIHNlbGYtaGVhbGluZyBETFEgcmVkcml2ZSAoYmVzdC1lZmZvcnQsIG5ldmVyIGZhaWxzIGJhdGNoKS5cbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGNvbnN0IGtleSA9IGUub3JnSWQgPz8gJyc7XG4gICAgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgKGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDApICsgMSk7XG4gICAgY29uc3QgYXQgPSBlLmNvbXBsZXRlZEF0IHx8IGUuc3RhcnRlZEF0O1xuICAgIGlmIChhdCkge1xuICAgICAgY29uc3QgcHJldiA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXYgfHwgYXQgPiBwcmV2KSBsYXN0RXZlbnRBdEJ5T3JnLnNldChrZXksIGF0KTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgcmVwb3J0SGVhbHRoQW5kUmVkcml2ZShiYXNlVXJsLCBldmVudC5SZWNvcmRzWzBdPy5ldmVudFNvdXJjZUFSTik7XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IHJlc2V0IGFsbCBtb2R1bGUtbGV2ZWwgY2FjaGVzL3Rocm90dGxlIHN0YXRlIHNvIHRlc3RzIGFyZVxuICogaXNvbGF0ZWQgZnJvbSBvbmUgYW5vdGhlci4gU3RyaXBwZWQgZnJvbSB0aGUgcHVibGlzaGVkIC5kLnRzIChzdHJpcEludGVybmFsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEZvclRlc3RzKCk6IHZvaWQge1xuICByZXNvbHZlZEJ5QXJuLmNsZWFyKCk7XG4gIGNvbW1pdFJlc3VsdENhY2hlLmNsZWFyKCk7XG4gIGxhc3RTaGFCeVBpcGVsaW5lLmNsZWFyKCk7XG4gIGNvbW1pdE1ldGFDYWNoZS5jbGVhcigpO1xuICBzY21Db29sZG93blVudGlsID0gMDtcbiAgZ2l0aHViVG9rZW5CeU9yZy5jbGVhcigpO1xuICBmb3J3YXJkZWRCeU9yZy5jbGVhcigpO1xuICBsYXN0RXZlbnRBdEJ5T3JnLmNsZWFyKCk7XG4gIGxhc3RIZWFsdGhBdCA9IDA7XG4gIGxhc3RSZWRyaXZlQXQgPSAwO1xuICBjYWNoZWRLZXkgPSBudWxsO1xuICBjYWNoZWRUb2tlbiA9IG51bGw7XG4gIGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gMDtcbn1cbiJdfQ==
|