@pipeline-builder/pipeline-data 4.1.3 → 4.1.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.
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { NotFoundError, createLogger, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@pipeline-builder/api-core';
3
+ import { ConflictError, NotFoundError, createLogger, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@pipeline-builder/api-core';
4
4
  import { SQL, eq, and, or, asc, desc, sql, inArray, getTableColumns } from 'drizzle-orm';
5
5
  import { withTenantTx, runWithTenantContext, getTenantContext } from '../database/tenancy.js';
6
6
  /**
@@ -16,6 +16,76 @@ export function drizzleRows(rows) {
16
16
  export function drizzleCount(rows) {
17
17
  return rows;
18
18
  }
19
+ /** Projection alias carrying the sort column's exact DB text for the next cursor. */
20
+ const CURSOR_SORT_KEY = '__cursorSortKey';
21
+ /**
22
+ * Opaque keyset cursor: the last row's sort value as Postgres TEXT (full
23
+ * precision — a JS `Date` would truncate `timestamptz` microseconds to ms, so
24
+ * `created_at > '<ms>'` re-returns or skips rows in the same millisecond) plus
25
+ * its `id` as the tie-breaker.
26
+ */
27
+ function encodeCursor(sortText, id) {
28
+ return Buffer.from(JSON.stringify([sortText, id]), 'utf8').toString('base64url');
29
+ }
30
+ /** Decode a cursor produced by {@link encodeCursor}; `null` when malformed. */
31
+ function decodeCursor(cursor) {
32
+ try {
33
+ const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
34
+ if (Array.isArray(parsed) && parsed.length === 2
35
+ && (parsed[0] === null || typeof parsed[0] === 'string')
36
+ && typeof parsed[1] === 'string' && parsed[1].length > 0) {
37
+ return { sortText: parsed[0], id: parsed[1] };
38
+ }
39
+ }
40
+ catch {
41
+ // fall through
42
+ }
43
+ return null;
44
+ }
45
+ const UUID_TEXT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
46
+ /** Postgres `timestamp[tz]::text` / `date::text` (also accepts ISO-8601). */
47
+ const TIMESTAMP_TEXT = /^\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}(?::?\d{2})?)?)?$/;
48
+ const NUMERIC_TEXT = /^-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?$/;
49
+ /**
50
+ * Whether `text` can be cast to `column`'s type. A decoded cursor is still
51
+ * client input: a value Postgres can't cast (a non-UUID id, a garbage
52
+ * timestamp) fails the whole query with a 500. Column types this doesn't know
53
+ * (text, varchar, …) accept any string.
54
+ */
55
+ function isCastableTo(column, text) {
56
+ const { columnType, dataType } = column;
57
+ const enumValues = column.enumValues;
58
+ if (columnType === 'PgUUID')
59
+ return UUID_TEXT.test(text);
60
+ if ((columnType === 'PgEnumColumn' || columnType === 'PgEnumObjectColumn') && enumValues?.length)
61
+ return enumValues.includes(text);
62
+ if (dataType === 'date' || columnType === 'PgTimestampString' || columnType === 'PgDateString')
63
+ return TIMESTAMP_TEXT.test(text);
64
+ if (dataType === 'boolean')
65
+ return text === 'true' || text === 'false';
66
+ if (dataType === 'number' || dataType === 'bigint')
67
+ return NUMERIC_TEXT.test(text);
68
+ return true;
69
+ }
70
+ /**
71
+ * Keyset predicate "strictly after (sortText, id)" for `ORDER BY sort <dir>, id <dir>`
72
+ * under Postgres' default null placement (ASC → NULLS LAST, DESC → NULLS FIRST).
73
+ * The text value is bound as a parameter compared against the column, so Postgres
74
+ * casts it back to the column's type at full precision.
75
+ */
76
+ function keysetAfter(sortColumn, idColumn, sortOrder, sortText, id) {
77
+ if (sortColumn === idColumn) {
78
+ return sortOrder === 'desc' ? sql `${idColumn} < ${id}` : sql `${idColumn} > ${id}`;
79
+ }
80
+ if (sortOrder === 'asc') {
81
+ return sortText === null
82
+ ? sql `(${sortColumn} IS NULL AND ${idColumn} > ${id})`
83
+ : sql `(${sortColumn} > ${sortText} OR (${sortColumn} = ${sortText} AND ${idColumn} > ${id}) OR ${sortColumn} IS NULL)`;
84
+ }
85
+ return sortText === null
86
+ ? sql `(${sortColumn} IS NOT NULL OR (${sortColumn} IS NULL AND ${idColumn} < ${id}))`
87
+ : sql `(${sortColumn} < ${sortText} OR (${sortColumn} = ${sortText} AND ${idColumn} < ${id}))`;
88
+ }
19
89
  /**
20
90
  * Retention before a soft-deleted row becomes purge-eligible, shared across
21
91
  * every CrudService entity (unified `SOFT_DELETE_RETENTION_DAYS`, default 30d).
@@ -185,18 +255,32 @@ export class CrudService {
185
255
  async findPaginated(filter, orgId, options = {}, parentOrgId) {
186
256
  const { limit: rawLimit = DEFAULT_PAGE_LIMIT, offset = 0, sortBy, sortOrder = 'asc', includeTotal = false, cursor, fields } = options;
187
257
  const limit = Math.min(Math.max(1, rawLimit), MAX_PAGE_LIMIT);
188
- // Cursor and offset are mutually exclusive — cursor takes precedence
189
- const useCursor = !!(cursor && sortBy);
258
+ // Total, deterministic order: (sort column, id). `id` is unique, so rows that
259
+ // share a sort value have a stable relative order and a keyset cursor can
260
+ // never skip or repeat them. An absent or UNKNOWN `sortBy` orders by `id`
261
+ // alone — an unknown sort used to add no WHERE and no ORDER BY while still
262
+ // emitting a cursor, so a cursor client looped on page 1 forever.
263
+ const idColumn = this.cols.id;
264
+ const sortColumn = (sortBy ? this.getSortColumn(sortBy) : null) ?? idColumn;
265
+ const direction = sortOrder === 'desc' ? desc : asc;
266
+ const orderBy = sortColumn === idColumn ? [direction(idColumn)] : [direction(sortColumn), direction(idColumn)];
267
+ // Cursor and offset are mutually exclusive — a valid cursor takes precedence.
268
+ // A malformed/tampered cursor — including well-formed JSON whose values
269
+ // can't be cast to the id / sort column types — is ignored (reads from the
270
+ // start) instead of reaching Postgres and failing the query.
271
+ const rawCursor = cursor ? decodeCursor(cursor) : null;
272
+ const decodedCursor = rawCursor
273
+ && isCastableTo(idColumn, rawCursor.id)
274
+ // (an id-only order never binds the sort value — see keysetAfter)
275
+ && (sortColumn === idColumn || rawCursor.sortText === null || isCastableTo(sortColumn, rawCursor.sortText))
276
+ ? rawCursor
277
+ : null;
278
+ if (cursor && !decodedCursor) {
279
+ this._logger.warn('Ignoring malformed pagination cursor', { entity: this.constructor.name });
280
+ }
190
281
  const conditions = this.buildConditions(filter, orgId, parentOrgId);
191
- // Cursor-based pagination: add WHERE clause for keyset pagination
192
- if (useCursor) {
193
- const sortColumn = this.getSortColumn(sortBy);
194
- if (sortColumn) {
195
- const op = sortOrder === 'desc'
196
- ? sql `${sortColumn} < ${cursor}`
197
- : sql `${sortColumn} > ${cursor}`;
198
- conditions.push(op);
199
- }
282
+ if (decodedCursor) {
283
+ conditions.push(keysetAfter(sortColumn, idColumn, sortOrder, decodedCursor.sortText, decodedCursor.id));
200
284
  }
201
285
  // Wrap the whole paginated read (SELECT + optional COUNT) in one
202
286
  // tenant tx. Both queries are visibility-scoped by the same RLS policy,
@@ -204,36 +288,28 @@ export class CrudService {
204
288
  // between them. When widening to a parent org, the whole read runs under
205
289
  // sysadmin context (see runRead) so the access-control WHERE is the gate.
206
290
  return this.runRead(parentOrgId, () => withTenantTx(async (tx) => {
207
- // Build SELECT — sparse fieldset when fields are specified. The sortBy
208
- // column MUST be part of the projection whenever sorting is active: the
209
- // next cursor is derived from `lastItem[sortBy]` below, so a fields set
210
- // that omits sortBy would leave the cursor undefined and stall the client
211
- // on page 1. buildFieldSelect always adds it back (like `id`).
212
- const selectSpec = fields ? this.buildFieldSelect(fields, sortBy) : undefined;
213
- let query = selectSpec
214
- ? tx.select(selectSpec).from(this.schema).where(and(...conditions))
215
- : tx.select().from(this.schema).where(and(...conditions));
216
- if (sortBy) {
217
- const sortColumn = this.getSortColumn(sortBy);
218
- if (sortColumn) {
219
- query = query.orderBy(sortOrder === 'desc' ? desc(sortColumn) : asc(sortColumn));
220
- }
221
- }
291
+ // Projection: the sparse fieldset (always includes `id`) or every column,
292
+ // plus the sort column's exact text for the next cursor.
293
+ const baseSelect = (fields ? this.buildFieldSelect(fields) : undefined) ?? getTableColumns(this.schema);
294
+ const selectSpec = { ...baseSelect, [CURSOR_SORT_KEY]: sql `${sortColumn}::text` };
222
295
  // Fetch limit+1 to detect hasMore without COUNT(*)
223
- const effectiveOffset = useCursor ? 0 : offset;
224
- const rows = await query
296
+ const effectiveOffset = decodedCursor ? 0 : offset;
297
+ const rows = await tx.select(selectSpec).from(this.schema).where(and(...conditions))
298
+ .orderBy(...orderBy)
225
299
  .limit(limit + 1)
226
300
  .offset(effectiveOffset).then(r => drizzleRows(r));
227
301
  const hasMore = rows.length > limit;
228
- const data = hasMore ? rows.slice(0, limit) : rows;
302
+ const page = hasMore ? rows.slice(0, limit) : rows;
303
+ const data = page.map((row) => {
304
+ const entity = { ...row };
305
+ delete entity[CURSOR_SORT_KEY];
306
+ return entity;
307
+ });
229
308
  const result = { data, limit, offset: effectiveOffset, hasMore };
230
- // Provide next cursor from last item's sort column value
231
- if (data.length > 0 && sortBy) {
232
- const lastItem = data[data.length - 1];
233
- const cursorValue = lastItem[sortBy];
234
- if (cursorValue !== undefined) {
235
- result.nextCursor = cursorValue instanceof Date ? cursorValue.toISOString() : String(cursorValue);
236
- }
309
+ if (hasMore) {
310
+ const last = page[page.length - 1];
311
+ const sortText = last[CURSOR_SORT_KEY];
312
+ result.nextCursor = encodeCursor(sortText == null ? null : String(sortText), String(last.id));
237
313
  }
238
314
  // Only run the COUNT(*) query when the caller explicitly needs the total.
239
315
  // Must include parentOrgId so `total` matches the widened data set.
@@ -250,14 +326,13 @@ export class CrudService {
250
326
  }
251
327
  /**
252
328
  * Build a column selection map for sparse fieldsets.
253
- * Falls back to full select if no matching columns found.
329
+ * Falls back to full select if no fields are requested.
254
330
  *
255
- * `sortBy` (when set) is always folded into the projection even if the caller's
256
- * `fields` omits it — cursor pagination reads the next cursor from the sort
257
- * column's value on the last row, so dropping it from the SELECT would yield an
258
- * undefined cursor and stall paging. Included the same way `id` always is.
331
+ * `id` is always included — it is the entity identity AND the keyset cursor's
332
+ * tie-breaker. The sort value for the cursor is projected separately (as text)
333
+ * by `findPaginated`, so the fieldset need not carry the sort column.
259
334
  */
260
- buildFieldSelect(fields, sortBy) {
335
+ buildFieldSelect(fields) {
261
336
  if (fields.length === 0)
262
337
  return undefined;
263
338
  const columns = {};
@@ -270,13 +345,6 @@ export class CrudService {
270
345
  if (col)
271
346
  columns[field] = col;
272
347
  }
273
- // Guarantee the sort column is selectable so the next cursor can be read
274
- // from the last row (see findPaginated). No-op if already added or unknown.
275
- if (sortBy && sortBy !== 'id' && !(sortBy in columns)) {
276
- const sortCol = this.cols[sortBy];
277
- if (sortCol)
278
- columns[sortBy] = sortCol;
279
- }
280
348
  // At minimum we'll have { id }, which is valid
281
349
  return columns;
282
350
  }
@@ -377,6 +445,10 @@ export class CrudService {
377
445
  */
378
446
  async create(data, userId) {
379
447
  const safeData = this.enforceOrgId(data, /* isCreate */ true);
448
+ // Create never overwrites. The conflict key can match a LIVE row (another
449
+ // author's, or one the caller couldn't edit through update) or a soft-deleted
450
+ // TOMBSTONE; replacing either would bypass update's access checks or restore's
451
+ // step-up. On any conflict nothing is written and the caller gets a 409.
380
452
  const [created] = await withTenantTx(async (tx) => tx
381
453
  .insert(this.schema)
382
454
  .values({
@@ -384,23 +456,11 @@ export class CrudService {
384
456
  createdBy: userId || 'system',
385
457
  updatedBy: userId || 'system',
386
458
  })
387
- .onConflictDoUpdate({
388
- target: this.conflictTarget,
389
- set: {
390
- ...safeData,
391
- // RESURRECT on re-create: `delete` soft-deletes (isActive=false + deletedAt/
392
- // deletedBy set), but the unique constraint keeps the tombstoned row, so a
393
- // re-create with the same conflict key lands here. Without resetting these,
394
- // the row's body updates but it stays soft-deleted and never reappears
395
- // (reads default to isActive=true). Matches the pipeline/plugin overrides.
396
- isActive: true,
397
- deletedAt: null,
398
- deletedBy: null,
399
- updatedAt: new Date(),
400
- updatedBy: userId || 'system',
401
- },
402
- })
459
+ .onConflictDoNothing({ target: this.conflictTarget })
403
460
  .returning().then(r => drizzleRows(r)));
461
+ if (!created) {
462
+ throw new ConflictError('A record with the same identity already exists. If it was deleted, restore it instead.');
463
+ }
404
464
  // Awaited intentionally: cache invalidation happens in the hook, and a
405
465
  // fire-and-forget pattern lets a subsequent read inside the same request
406
466
  // return the stale pre-write entry. The hook is expected to be fast
@@ -554,78 +614,6 @@ export class CrudService {
554
614
  .where(and(...conditions))
555
615
  .returning().then(r => drizzleRows(r)));
556
616
  }
557
- /**
558
- * Create multiple entities in a single batch insert.
559
- * Uses upsert (onConflictDoUpdate) — all rows are inserted in one query per chunk.
560
- * Chunks of 100 to stay within PostgreSQL parameter limits.
561
- */
562
- /**
563
- * Build the `onConflictDoUpdate` SET for a bulk upsert. Unlike a single-row
564
- * create (which can spread the one row's data), a batched insert has many rows,
565
- * so each updatable column is written from `excluded.*` (the would-be-inserted
566
- * value) — otherwise an existing row's fields are silently discarded and only
567
- * timestamps bump. Skips identity/immutable (`id`, `createdAt`, `createdBy`)
568
- * and the conflict-target columns; `updatedAt`/`updatedBy` get the fresh values.
569
- */
570
- buildBulkUpsertSet(now, user) {
571
- const conflictNames = new Set(this.conflictTarget.map((c) => c.name));
572
- const set = {};
573
- for (const [key, col] of Object.entries(getTableColumns(this.schema))) {
574
- const name = col.name;
575
- if (key === 'id' || key === 'createdAt' || key === 'createdBy' || conflictNames.has(name))
576
- continue;
577
- if (key === 'updatedAt') {
578
- set[key] = now;
579
- continue;
580
- }
581
- if (key === 'updatedBy') {
582
- set[key] = user;
583
- continue;
584
- }
585
- set[key] = sql `excluded.${sql.identifier(name)}`;
586
- }
587
- // RESURRECT on bulk re-create (matches the single-row create): reset the
588
- // soft-delete columns explicitly rather than rely on `excluded.*` + column
589
- // defaults, so a re-created same-key row is always reactivated, not left
590
- // tombstoned. All CrudService entities carry these (delete() sets all three).
591
- set.isActive = true;
592
- set.deletedAt = null;
593
- set.deletedBy = null;
594
- return set;
595
- }
596
- async bulkCreate(items, userId) {
597
- if (items.length === 0)
598
- return [];
599
- const CHUNK_SIZE = 100;
600
- const now = new Date();
601
- const user = userId || 'system';
602
- const conflictSet = this.buildBulkUpsertSet(now, user);
603
- const results = await withTenantTx(async (tx) => {
604
- const allCreated = [];
605
- for (let i = 0; i < items.length; i += CHUNK_SIZE) {
606
- const chunk = items.slice(i, i + CHUNK_SIZE);
607
- const values = chunk.map(data => ({
608
- ...this.enforceOrgId(data),
609
- createdBy: user,
610
- updatedBy: user,
611
- }));
612
- const created = await tx
613
- .insert(this.schema)
614
- .values(values)
615
- .onConflictDoUpdate({
616
- target: this.conflictTarget,
617
- set: conflictSet,
618
- })
619
- .returning().then(r => drizzleRows(r));
620
- allCreated.push(...created);
621
- }
622
- return allCreated;
623
- });
624
- // Run hooks in parallel but await all before returning so a subsequent
625
- // read in the same request sees a coherent post-write view.
626
- await Promise.all(results.map(entity => this.onAfterCreate(entity, userId).catch(err => this._logger.warn('Lifecycle hook failed', { error: String(err) }))));
627
- return results;
628
- }
629
617
  /**
630
618
  * The `visibility` predicate for a bulk soft-delete, mirroring
631
619
  * `requireVisibilityWriteAccess` rung for rung so bulk and single-row delete
@@ -882,4 +870,4 @@ export class CrudService {
882
870
  return purgedId;
883
871
  }
884
872
  }
885
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxJQUFhO0lBQzFDLE9BQU8sSUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFhO0lBQ3hDLE9BQU8sSUFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBc0dEOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUU3STs7OzZFQUc2RTtBQUM3RSxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sd0JBQXdCLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sT0FBZ0IsV0FBVztJQVMvQjs7Ozs7O09BTUc7SUFDSCxJQUFZLElBQUk7UUFDZCxPQUFPLElBQUks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QUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciwgREVGQVVMVF9QQUdFX0xJTUlULCBNQVhfUEFHRV9MSU1JVCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgb3IsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKiBUaGUgRHJpenpsZSB0cmFuc2FjdGlvbiBvYmplY3QgaGFuZGVkIHRvIGB3aXRoVGVuYW50VHhgIGNhbGxiYWNrcy4gUGFzc2VkIHRvXG4gKiAgYG9uQmVmb3JlUHVyZ2VgIHNvIGEgc3ViY2xhc3MncyBkZXBlbmRlbnQgdGVhcmRvd24gcnVucyBpbiB0aGUgU0FNRSBwdXJnZVxuICogIHRyYW5zYWN0aW9uIChhdG9taWMgd2l0aCB0aGUgcGFyZW50IERFTEVURSksIG5vdCBhIGZyZXNoIGNvbm5lY3Rpb24uICovXG5leHBvcnQgdHlwZSBDcnVkVHggPSBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgaXNEZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHNvcnRCeT86IHN0cmluZztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBXaGVuIHRydWUsIHJ1bnMgYSBzZXBhcmF0ZSBDT1VOVCgqKSBxdWVyeSB0byBpbmNsdWRlIGV4YWN0IHRvdGFsLiBEZWZhdWx0OiBmYWxzZS4gKi9cbiAgaW5jbHVkZVRvdGFsPzogYm9vbGVhbjtcbiAgLyoqIEN1cnNvci1iYXNlZCBwYWdpbmF0aW9uOiBmZXRjaCByb3dzIGFmdGVyIHRoaXMgY3Vyc29yIHZhbHVlICh1c2VzIHNvcnRCeSBjb2x1bW4pLiAqL1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIC8qKiBTcGFyc2UgZmllbGRzZXQ6IGNvbHVtbiBuYW1lcyB0byBzZWxlY3QuIFJldHVybnMgYWxsIGNvbHVtbnMgd2hlbiBvbWl0dGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZWQgcmVzdWx0IHdpdGggbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIC8qKiBUb3RhbCBjb3VudCBvZiBtYXRjaGluZyBlbnRpdGllcy4gT25seSBwcmVzZW50IHdoZW4gaW5jbHVkZVRvdGFsIGlzIHRydWUuICovXG4gIHRvdGFsPzogbnVtYmVyO1xuICBsaW1pdDogbnVtYmVyO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgLyoqIEN1cnNvciBwb2ludGluZyB0byB0aGUgbGFzdCBpdGVtLCBmb3IgY3Vyc29yLWJhc2VkIHBhZ2luYXRpb24uICovXG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA/PyBudWxsOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRQcm9qZWN0Q29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLnByb2plY3Q7IH1cbiAqICAgcHJvdGVjdGVkIGdldE9yZ0NvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5vcmdJZDsgfVxuICogfVxuICogYGBgXG4gKi9cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIHN1YmNsYXNzIHRhYmxlJ3MgY29sdW1ucyB0aGUgYmFzZSBjbGFzcyB0b3VjaGVzXG4gKiAgZGlyZWN0bHkuIGBpZGAvYGlzQWN0aXZlYC9gaXNEZWZhdWx0YCBhcmUgYWx3YXlzIHByZXNlbnQgb24gYSBDUlVEIGVudGl0eTtcbiAqICBgdmlzaWJpbGl0eWAgb25seSBvbiB2aXNpYmlsaXR5LWJlYXJpbmcgZW50aXRpZXM7IHRoZSBpbmRleCBzaWduYXR1cmVcbiAqICBjb3ZlcnMgZHluYW1pYyAoc3BhcnNlLWZpZWxkc2V0KSBjb2x1bW4gYWNjZXNzLiAqL1xuaW50ZXJmYWNlIENydWRDb2x1bW5zIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIHZpc2liaWxpdHk/OiBBbnlDb2x1bW47XG4gIC8qKiBBdXRob3IgY29sdW1uIOKAlCB0aGUgYHByaXZhdGVgIHJ1bmcgb2YgdGhlIHZpc2liaWxpdHkgbGFkZGVyIGlzIGF1dGhvci1vbmx5LiAqL1xuICBjcmVhdGVkQnk/OiBBbnlDb2x1bW47XG4gIC8vIFNvZnQtZGVsZXRlIGxpZmVjeWNsZSBjb2x1bW5zIChwcmVzZW50IG9uIHRvbWJzdG9uZS1iZWFyaW5nIGVudGl0aWVzIG9ubHk7XG4gIC8vIGByZXN0b3JlYC9gcHVyZ2VFeHBpcmVkYCBhcmUgbm8tb3BzIHdoZW4gYWJzZW50KS5cbiAgZGVsZXRlZEF0PzogQW55Q29sdW1uO1xuICBwdXJnZUFmdGVyPzogQW55Q29sdW1uO1xuICBba2V5OiBzdHJpbmddOiBBbnlDb2x1bW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZSwgc2hhcmVkIGFjcm9zc1xuICogZXZlcnkgQ3J1ZFNlcnZpY2UgZW50aXR5ICh1bmlmaWVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsIGRlZmF1bHQgMzBkKS5cbiAqIFN0YW1wZWQgaW50byBgcHVyZ2VfYWZ0ZXJgIGF0IGRlbGV0ZSB0aW1lOyB0aGUgcGVyLXNlcnZpY2UgcHVyZ2Ugc3dlZXAgaGFyZC1cbiAqIGRlbGV0ZXMgdG9tYnN0b25lcyBvbmNlIGl0IGhhcyBwYXNzZWQuIGAwYCBkaXNhYmxlcyBwdXJnZS1kZWFkbGluZSBzdGFtcGluZy5cbiAqL1xuY29uc3QgU09GVF9ERUxFVEVfUkVURU5USU9OX01TID0gTWF0aC5tYXgoMCwgTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52LlNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTID8/ICczMCcsIDEwKSB8fCAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgc2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiB3aW5kb3cgaW4gbXMgKGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsXG4gKiAgZGVmYXVsdCAzMGQ7IDAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcpLiBFeHBvc2VkIHNvIG5vbi1DcnVkU2VydmljZVxuICogIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuIHBsYXRmb3JtJ3MgaGFuZC1yb2xsZWQgZGFzaGJvYXJkL2FsZXJ0IHNlcnZpY2VzKVxuICogIHN0YW1wIGBwdXJnZV9hZnRlcmAgd2l0aCB0aGUgU0FNRSB3aW5kb3cgdGhlIENydWRTZXJ2aWNlIGVudGl0aWVzIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENydWRTZXJ2aWNlPFxuICBURW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSxcbiAgVEZpbHRlcixcbiAgVEluc2VydCxcbiAgVFVwZGF0ZSxcbj4ge1xuICAvKiogRHJpenpsZSBzY2hlbWEgdGFibGUgZm9yIHRoaXMgZW50aXR5ICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgc2NoZW1hKCk6IFBnVGFibGU7XG5cbiAgLyoqXG4gICAqIFR5cGVkIGNvbHVtbiB2aWV3IG9mIHtAbGluayBzY2hlbWF9LiBgUGdUYWJsZWAgZXhwb3NlcyBubyBzdGF0aWMgY29sdW1ucywgc29cbiAgICogdGhlIGJhc2UgY2xhc3MgcHJldmlvdXNseSByZWFjaGVkIGZvciBgKHRoaXMuc2NoZW1hIGFzIGFueSkuaWRgIGV0Yy4gYXQgZWFjaFxuICAgKiB1c2U7IGNlbnRyYWxpemUgdGhhdCBzaW5nbGUgdW5hdm9pZGFibGUgY2FzdCBoZXJlIHNvIGNhbGxlcnMgZ2V0IHN0cnVjdHVyZWQsXG4gICAqIHR5cGVkIGFjY2VzcyBpbnN0ZWFkLiBgdmlzaWJpbGl0eWAgaXMgb3B0aW9uYWwgKG5vdCBldmVyeSBlbnRpdHkgaGFzIGl0KVxuICAgKiBhbmQgdGhlIGluZGV4IHNpZ25hdHVyZSBjb3ZlcnMgZHluYW1pYyBzcGFyc2UtZmllbGRzZXQgY29sdW1uIGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbHMoKTogQ3J1ZENvbHVtbnMge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSBhcyB1bmtub3duIGFzIENydWRDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBmaWx0ZXJpbmcgZW50aXRpZXMuXG4gICAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGhvbm9yZWQgYnlcbiAgICogc2VydmljZXMgdGhhdCBvcHQgaW50byBwYXJlbnQtaW5oZXJpdGVkIHZpc2liaWxpdHkgKGUuZy4gcGx1Z2lucykuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRDb25kaXRpb25zKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW107XG5cbiAgLyoqIEdldCB0aGUgc2NoZW1hIGNvbHVtbiBmb3Igc29ydGluZyBieSBmaWVsZCBuYW1lICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTb3J0Q29sdW1uKHNvcnRCeTogc3RyaW5nKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKiogR2V0IHRoZSBwcm9qZWN0IGNvbHVtbiBmb3Igc2V0RGVmYXVsdCBzY29waW5nIChudWxsIGlmIGVudGl0eSBoYXMgbm8gcHJvamVjdCBzY29wZSkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFByb2plY3RDb2x1bW4oKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0IHRoZSB0ZW5hbnQgb3JnLWlkIGNvbHVtbi4gVXNlZCBib3RoIHRvIHNjb3BlIGBzZXREZWZhdWx0YCBhbmQgdG8gcGluXG4gICAqIGV2ZXJ5IHdyaXRlICh1cGRhdGUvZGVsZXRlL2J1bGtEZWxldGUpIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIOKAlCBzbyBpdCBNVVNUXG4gICAqIGJlIHRoZSB0ZW5hbnQgYG9yZ0lkYCBjb2x1bW4sIG5vdCBhIGRpc3BsYXkvbmFtZSBjb2x1bW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0T3JnQ29sdW1uKCk6IEFueUNvbHVtbjtcblxuICAvKiogR2V0IHRoZSB1bmlxdWUgY29uc3RyYWludCBjb2x1bW5zIGZvciBvbkNvbmZsaWN0RG9VcGRhdGUgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb25mbGljdFRhcmdldCgpOiBBbnlDb2x1bW5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NydWQtc2VydmljZScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZhaWwgZmFzdCBpZiBhIHN1YmNsYXNzIGRvZXNuJ3QgZXhwb3NlIGEgdGVuYW50IG9yZyBjb2x1bW4uIFRoZSB3cml0ZVxuICAgIC8vIHBhdGhzICh3cml0ZUNvbmRpdGlvbnMgLyBidWxrRGVsZXRlKSBwaW4gbXV0YXRpb25zIHRvIHRoZSBjYWxsZXIncyBvd25cbiAgICAvLyBvcmcgdGhyb3VnaCBpdDsgYSBtaXNzaW5nIGNvbHVtbiB3b3VsZCBzaWxlbnRseSBkcm9wIHRoYXQgZ3VhcmQg4oCUIGFcbiAgICAvLyBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuIOKAlCBzbyBhc3NlcnQgaXRzIHByZXNlbmNlIHVwIGZyb250LlxuICAgIGlmICh0aGlzLmdldE9yZ0NvbHVtbigpID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBnZXRPcmdDb2x1bW4oKSBtdXN0IHJldHVybiB0aGUgdGVuYW50IG9yZyBjb2x1bW5gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9ucyBmb3IgYSBzaW5nbGUgZW50aXR5IGJ5IElELlxuICAgKiAgYHBhcmVudE9yZ0lkYCB3aWRlbnMgdmlzaWJpbGl0eSB0byBhIHBhcmVudCBvcmcncyBwdWJsaWMgcm93cyAob3JnIOKGkiB0ZWFtXG4gICAqICBoaWVyYXJjaHkpIOKAlCBzYW1lIG9wdC1pbiBzZW1hbnRpY3MgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYC4gT21pdHRlZCBieSB0aGVcbiAgICogIHdyaXRlIHBhdGggKGB3cml0ZUNvbmRpdGlvbnNgKSwgd2hpY2ggbXVzdCBzdGF5IG93bi1vcmcgc2NvcGVkLiAqL1xuICBwcml2YXRlIGlkQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb25kaXRpb25zKHsgaWQgfSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9ucyBmb3IgYSBNVVRBVElPTiAodXBkYXRlL2RlbGV0ZSkgb2YgYSBzaW5nbGUgZW50aXR5LlxuICAgKlxuICAgKiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlIFJFQUQgYWNjZXNzLWNvbnRyb2wgY2xhdXNlLCB3aGljaCBhbHNvIG1hdGNoZXNcbiAgICogc3lzdGVtLW9yZyAvIG90aGVyLW9yZyBQVUJMSUMgcmVjb3JkcyDigJQgc28gd2l0aG91dCBhbiBleHRyYSBvd25lcnNoaXAgcGluIGFueVxuICAgKiB0ZW5hbnQgY291bGQgdXBkYXRlIG9yIHNvZnQtZGVsZXRlIGFub3RoZXIgb3JnJ3MgKG9yIHRoZSBzeXN0ZW0gb3JnJ3MpIHB1YmxpY1xuICAgKiByZWNvcmRzLiBBTkQgYSBzdHJpY3QgYG9yZ0lkID09PSBjYWxsZXJgIHByZWRpY2F0ZTogdGhlIHJlYWQgY2xhdXNlJ3NcbiAgICogcHVibGljLU9SIGJyYW5jaCByZXF1aXJlcyBgb3JnX2lkID0gJ3N5c3RlbSdgLCB3aGljaCB0aGVuIGNhbid0IGJlIHNhdGlzZmllZCxcbiAgICogbGVhdmluZyBvbmx5IG93bi1vcmcgcm93cy4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHMgZnVsbCBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICAvLyBQaW4gdGhlIG11dGF0aW9uIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIHZpYSB0aGUgdGVuYW50IGNvbHVtblxuICAgIC8vIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsIGluIHRoZSBjb25zdHJ1Y3Rvcikg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgIC8vIHNldERlZmF1bHQgYW5kIHdpdGhvdXQgdGhlIG9sZCBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IHdhcyBhYnNlbnQuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICAvLyBGb3JjZSBFWEFDVCBpZCBlcXVhbGl0eSBvbiB0aGUgbXV0YXRpb24gcGF0aC4gYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZVxuICAgIC8vIGxpc3QtZmlsdGVyIGNsYXVzZSwgd2hvc2UgYGJ1aWxkSWRGaWx0ZXJgIFBSRUZJWC1tYXRjaGVzIChgaWQ6OnRleHQgTElLRVxuICAgIC8vICd2YWwlJ2ApIGFueSBub24tZnVsbC1VVUlEIHZhbHVlIOKAlCBzbyBhIHBhcnRpYWwgaWQgKGBERUxFVEUgL3gvYWJgKSB3b3VsZFxuICAgIC8vIHNvZnQtZGVsZXRlL211dGF0ZSBFVkVSWSBvd24tb3JnIHJvdyB3aG9zZSBpZCBzdGFydHMgd2l0aCBgYWJgIGFuZCByZXBvcnRcbiAgICAvLyB0b3VjaGluZyBvbmUuIEFORGluZyBhbiBleGFjdCBgaWQgPSB2YWxgIGNvbGxhcHNlcyB0aGUgcHJlZml4IGNsYXVzZSB0byBhdFxuICAgIC8vIG1vc3QgdGhlIHNpbmdsZSBleGFjdCByb3c7IGEgbWFsZm9ybWVkL3BhcnRpYWwgaWQgdGhlbiBtYXRjaGVzIG5vdGhpbmdcbiAgICAvLyAo4oaSIDQwNCB2aWEgdGhlIGNhbGxlcnMnIGBpZiAoIWRlbGV0ZWQpYCBndWFyZCkgaW5zdGVhZCBvZiBtYXNzLW11dGF0aW5nLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIC8qKiBFeGFjdCBpZCBlcXVhbGl0eSwgbG93ZXItY2FzZWQgdG8gbWF0Y2ggYGJ1aWxkSWRGaWx0ZXJgJ3MgZnVsbC1VVUlEIGJyYW5jaC5cbiAgICogIGBzY2hlbWFgIGlzIHR5cGVkIGBQZ1RhYmxlYCAobm8gc3RhdGljIGAuaWRgKSwgc28gY2FzdCDigJQgc2FtZSBwYXR0ZXJuIHRoZVxuICAgKiAgc29ydC9kZWZhdWx0IGhlbHBlcnMgdXNlIGZvciBjb2x1bW4gYWNjZXNzLiAqL1xuICBwcml2YXRlIGV4YWN0SWRDb25kaXRpb24oaWQ6IHN0cmluZyk6IFNRTCB7XG4gICAgcmV0dXJuIGVxKHRoaXMuY29scy5pZCwgU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIExpZmVjeWNsZSBob29rcyDigJQgb3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyB0byByZWFjdCB0byBtdXRhdGlvbnNcbiAgLy8gVGhlc2UgYXJlIGZpcmUtYW5kLWZvcmdldDogZXJyb3JzIGFyZSBsb2dnZWQgYnV0IG5ldmVyIGJsb2NrIHRoZSBjYWxsZXIuXG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckNyZWF0ZShfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgdXBkYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclVwZGF0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHNvZnQtZGVsZXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckRlbGV0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGlzIHJlc3RvcmVkICh1bmRvIHRoZSBkZWxldGUpLiBPdmVycmlkZVxuICAgKiAgZm9yIGVudGl0aWVzIHdob3NlIHJlc3RvcmUgaGFzIHNpZGUtZWZmZWN0cyAoZS5nLiByZS1ub3RpZnkpLiBCZXN0LWVmZm9ydC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJSZXN0b3JlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSBpZHMgYWJvdXQgdG8gYmUgaGFyZC1wdXJnZWQsIEJFRk9SRSB0aGUgZGVsZXRlLCBpbnNpZGUgdGhlXG4gICAqICBwdXJnZSB0cmFuc2FjdGlvbiAoYHR4YCkg4oCUIGEgc3ViY2xhc3MgdGVhcmluZyBkb3duIGRlcGVuZGVudHMgdGhhdCBsYWNrIE9OXG4gICAqICBERUxFVEUgQ0FTQ0FERSBNVVNUIHVzZSBgdHhgIHNvIHRoZSB0ZWFyZG93biBpcyBhdG9taWMgd2l0aCB0aGUgcGFyZW50XG4gICAqICBERUxFVEUgKGFuZCBjYW4ndCBzZWxmLWRlYWRsb2NrIGFnYWluc3QgaXRzIHJvdyBsb2NrcykuIFRocm93aW5nIGFib3J0cyB0aGF0XG4gICAqICBiYXRjaCdzIHB1cmdlIChyb3dzIHN0YXkgdG9tYnN0b25lZCwgcmV0cmllZCBuZXh0IHRpY2spLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25CZWZvcmVQdXJnZShfaWRzOiBzdHJpbmdbXSwgX3R4OiBDcnVkVHgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciByb3dzIGFyZSBoYXJkLXB1cmdlZCwgZm9yIGV4dGVybmFsIHNpZGUtZWZmZWN0cyAoZS5nLiBwbHVnaW5cbiAgICogIGltYWdlIEdDKS4gQmVzdC1lZmZvcnQ6IGVycm9ycyBhcmUgbG9nZ2VkLCBuZXZlciBibG9jayB0aGUgc3dlZXAuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyUHVyZ2UoX2lkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUuIERlZmF1bHRzIHRvIHRoZVxuICAgKiAgc2hhcmVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2A7IG92ZXJyaWRlIHBlciBlbnRpdHkgZm9yIGEgYmVzcG9rZSB3aW5kb3cuICovXG4gIHByb3RlY3RlZCBnZXQgc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbiAgfVxuXG4gIC8qKiBUaGUgYHB1cmdlX2FmdGVyYCB2YWx1ZSB0byBzdGFtcCBvbiBhIHNvZnQtZGVsZXRlOiBgbm93ICsgcmV0ZW50aW9uYCwgb3IgdGhlXG4gICAqICBzcHJlYWQtZnJpZW5kbHkgZW1wdHkgb2JqZWN0IHdoZW4gdGhlIGVudGl0eSBoYXMgbm8gYHB1cmdlX2FmdGVyYCBjb2x1bW4uXG4gICAqICBgcHJvdGVjdGVkYCBzbyBzdWJjbGFzc2VzIHdpdGggaGFuZC1yb2xsZWQgc29mdC1kZWxldGUgcGF0aHMgKGUuZy5cbiAgICogIG1lc3NhZ2Utc2VydmljZSdzIHRocmVhZCBjYXNjYWRlIC8gc3lzYWRtaW4gbW9kZXJhdGlvbikgc3RhbXAgaXQgdG9vIOKAlCBhblxuICAgKiAgdW4tc3RhbXBlZCB0b21ic3RvbmUgaGFzIE5VTEwgYHB1cmdlX2FmdGVyYCBhbmQgaXMgbmV2ZXIgaGFyZC1wdXJnZWQuICovXG4gIHByb3RlY3RlZCBwdXJnZUFmdGVyU3RhbXAobm93OiBEYXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5jb2xzLnB1cmdlQWZ0ZXIgfHwgdGhpcy5zb2Z0RGVsZXRlUmV0ZW50aW9uTXMgPD0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHB1cmdlQWZ0ZXI6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcykgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aGVuIGEgcmVhZCBpcyB3aWRlbmVkIHRvIGEgcGFyZW50IG9yZyAoYHBhcmVudE9yZ0lkYFxuICAgKiBzZXQpLCB0aGUgcGFyZW50J3Mgcm93cyBhcmUgb3V0c2lkZSB0aGUgY2FsbGVyJ3MgUkxTIHNjb3BlLCBzbyB0aGUgcmVhZCBtdXN0XG4gICAqIHJ1biB1bmRlciBzeXNhZG1pbiBjb250ZXh0IOKAlCB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIChvd24gKyBwYXJlbnQgK1xuICAgKiBzeXN0ZW0gcHVibGljLCBidWlsdCBzZXJ2ZXItc2lkZSBmcm9tIGEgdHJ1c3RlZCBKV1QgY2xhaW0pIGlzIHRoZW4gdGhlXG4gICAqIGF1dGhvcml0YXRpdmUgdGVuYW5jeSBnYXRlLiBXaXRob3V0IGBwYXJlbnRPcmdJZGAgaXQgc3RheXMgUkxTLXNjb3BlZC5cbiAgICpcbiAgICogSU5WQVJJQU5UICh3aHkgdGhlIHN5c2FkbWluIGJ5cGFzcyBpcyBzYWZlKTogdGhlIFdIRVJFIGNsYXVzZSBpcyBhbHdheXNcbiAgICogc2VydmVyLWJ1aWx0IGJ5IGBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpYCBmcm9tIHZhbHVlc1xuICAgKiBkZXJpdmVkIGZyb20gdGhlIHZhbGlkYXRlZCBKV1QgKGBvcmdJZGAgPSBhY3RpdmUgb3JnLCBgcGFyZW50T3JnSWRgID0gdGhlXG4gICAqIGFjdGl2ZSBvcmcncyBwYXJlbnQpLiBOb25lIG9mIHRoZW0gaXMgYSByYXcgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUsIHNvIHRoZVxuICAgKiBieXBhc3Mgb25seSBldmVyIHdpZGVucyB0aGUgcmVhZCB0byB0aGUgY2FsbGVyJ3Mgb3duIHN1YnRyZWUgKyBzeXN0ZW0gcHVibGljXG4gICAqIHJvd3Mg4oCUIGl0IGNhbiBOT1QgYmUgc3RlZXJlZCBhdCBhbiBhcmJpdHJhcnkgb3JnLiBOT1RFOiB0aGlzIGRvZXMgcmVtb3ZlIHRoZVxuICAgKiBSTFMgYmFja3N0b3AgZm9yIHRoZSB3aWRlbmVkIHJlYWQ7IGEgc2luZ2xlLUdVQyBgYXBwLm9yZ19pZGAgY2FuJ3QgZXhwcmVzc1xuICAgKiB0aGUgXCJvd24gT1IgcGFyZW50IE9SIHN5c3RlbVwiIHNldCB0aGUgcG9saWN5IHdvdWxkIG5lZWQsIHNvIHJlcGxhY2luZyB0aGVcbiAgICogYnlwYXNzIHdvdWxkIHJlcXVpcmUgYSB0ZW5hbmN5LWxheWVyIGNoYW5nZSAoZS5nLiBhIG11bHRpLW9yZyBSTFMgcG9saWN5KS5cbiAgICogRGVmZXJyZWQgZGVsaWJlcmF0ZWx5IOKAlCBkbyBub3Qgc3dhcCB0aGlzIGZvciBhIGJsYW5rZXQgYnlwYXNzIHdpdGhvdXRcbiAgICogcmUtY2hlY2tpbmcgdGhlIFdIRVJFIGlzIHN0aWxsIGZ1bGx5IHNlcnZlci1idWlsdC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVhZDxUPihwYXJlbnRPcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwYXJlbnRPcmdJZCA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGZuKSA6IGZuKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqL1xuICBhc3luYyBmaW5kKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgRklSU1QgZW50aXR5IG1hdGNoaW5nIGBmaWx0ZXJgIOKAlCBhIGJvdW5kZWQgKGBMSU1JVCAxYCkgdmFyaWFudCBvZlxuICAgKiBgZmluZGAgZm9yIHRoZSBcIm1hdGNoIGJ5IGZpbHRlciwgdGFrZSBvbmVcIiByZWFkIHBhdGhzIChlLmcuIGBHRVQgL2ZpbmRgKSwgc29cbiAgICogdGhleSBkb24ndCBgU0VMRUNUYCBldmVyeSBtYXRjaGluZyBvcmcgcm93IGp1c3QgdG8gcmV0dXJuIGBbMF1gLlxuICAgKi9cbiAgYXN5bmMgZmluZEZpcnN0KGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIHdpdGggcGFnaW5hdGlvbiBhbmQgc29ydGluZ1xuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGZpbmRQYWdpbmF0ZWQoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIG9yZ0lkPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICAgIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3VsdDxURW50aXR5Pj4ge1xuICAgIGNvbnN0IHsgbGltaXQ6IHJhd0xpbWl0ID0gREVGQVVMVF9QQUdFX0xJTUlULCBvZmZzZXQgPSAwLCBzb3J0QnksIHNvcnRPcmRlciA9ICdhc2MnLCBpbmNsdWRlVG90YWwgPSBmYWxzZSwgY3Vyc29yLCBmaWVsZHMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCByYXdMaW1pdCksIE1BWF9QQUdFX0xJTUlUKTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGN1cnNvciB0YWtlcyBwcmVjZWRlbmNlXG4gICAgY29uc3QgdXNlQ3Vyc29yID0gISEoY3Vyc29yICYmIHNvcnRCeSk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgLy8gQ3Vyc29yLWJhc2VkIHBhZ2luYXRpb246IGFkZCBXSEVSRSBjbGF1c2UgZm9yIGtleXNldCBwYWdpbmF0aW9uXG4gICAgaWYgKHVzZUN1cnNvcikge1xuICAgICAgY29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ2V0U29ydENvbHVtbihzb3J0QnkpO1xuICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgY29uc3Qgb3AgPSBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgID8gc3FsYCR7c29ydENvbHVtbn0gPCAke2N1cnNvcn1gXG4gICAgICAgICAgOiBzcWxgJHtzb3J0Q29sdW1ufSA+ICR7Y3Vyc29yfWA7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JhcCB0aGUgd2hvbGUgcGFnaW5hdGVkIHJlYWQgKFNFTEVDVCArIG9wdGlvbmFsIENPVU5UKSBpbiBvbmVcbiAgICAvLyB0ZW5hbnQgdHguIEJvdGggcXVlcmllcyBhcmUgdmlzaWJpbGl0eS1zY29wZWQgYnkgdGhlIHNhbWUgUkxTIHBvbGljeSxcbiAgICAvLyBhbmQgcGlubmluZyB0aGVtIHRvIGEgc2luZ2xlIHR4IGtlZXBzIHRoZSBgYXBwLm9yZ19pZGAgR1VDIHN0YWJsZVxuICAgIC8vIGJldHdlZW4gdGhlbS4gV2hlbiB3aWRlbmluZyB0byBhIHBhcmVudCBvcmcsIHRoZSB3aG9sZSByZWFkIHJ1bnMgdW5kZXJcbiAgICAvLyBzeXNhZG1pbiBjb250ZXh0IChzZWUgcnVuUmVhZCkgc28gdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGlzIHRoZSBnYXRlLlxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIFNFTEVDVCDigJQgc3BhcnNlIGZpZWxkc2V0IHdoZW4gZmllbGRzIGFyZSBzcGVjaWZpZWQuIFRoZSBzb3J0QnlcbiAgICAgIC8vIGNvbHVtbiBNVVNUIGJlIHBhcnQgb2YgdGhlIHByb2plY3Rpb24gd2hlbmV2ZXIgc29ydGluZyBpcyBhY3RpdmU6IHRoZVxuICAgICAgLy8gbmV4dCBjdXJzb3IgaXMgZGVyaXZlZCBmcm9tIGBsYXN0SXRlbVtzb3J0QnldYCBiZWxvdywgc28gYSBmaWVsZHMgc2V0XG4gICAgICAvLyB0aGF0IG9taXRzIHNvcnRCeSB3b3VsZCBsZWF2ZSB0aGUgY3Vyc29yIHVuZGVmaW5lZCBhbmQgc3RhbGwgdGhlIGNsaWVudFxuICAgICAgLy8gb24gcGFnZSAxLiBidWlsZEZpZWxkU2VsZWN0IGFsd2F5cyBhZGRzIGl0IGJhY2sgKGxpa2UgYGlkYCkuXG4gICAgICBjb25zdCBzZWxlY3RTcGVjID0gZmllbGRzID8gdGhpcy5idWlsZEZpZWxkU2VsZWN0KGZpZWxkcywgc29ydEJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgIGxldCBxdWVyeSA9IHNlbGVjdFNwZWNcbiAgICAgICAgPyB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgOiB0eC5zZWxlY3QoKS5mcm9tKHRoaXMuc2NoZW1hKS53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpO1xuXG4gICAgICBpZiAoc29ydEJ5KSB7XG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KTtcbiAgICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkoc29ydE9yZGVyID09PSAnZGVzYycgPyBkZXNjKHNvcnRDb2x1bW4pIDogYXNjKHNvcnRDb2x1bW4pKSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSB1c2VDdXJzb3IgPyAwIDogb2Zmc2V0O1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAgIC5saW1pdChsaW1pdCArIDEpXG4gICAgICAgIC5vZmZzZXQoZWZmZWN0aXZlT2Zmc2V0KS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IGRhdGEgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFBhZ2luYXRlZFJlc3VsdDxURW50aXR5PiA9IHsgZGF0YSwgbGltaXQsIG9mZnNldDogZWZmZWN0aXZlT2Zmc2V0LCBoYXNNb3JlIH07XG5cbiAgICAgIC8vIFByb3ZpZGUgbmV4dCBjdXJzb3IgZnJvbSBsYXN0IGl0ZW0ncyBzb3J0IGNvbHVtbiB2YWx1ZVxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzb3J0QnkpIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGN1cnNvclZhbHVlID0gbGFzdEl0ZW1bc29ydEJ5XTtcbiAgICAgICAgaWYgKGN1cnNvclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQubmV4dEN1cnNvciA9IGN1cnNvclZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGN1cnNvclZhbHVlLnRvSVNPU3RyaW5nKCkgOiBTdHJpbmcoY3Vyc29yVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoZSBDT1VOVCgqKSBxdWVyeSB3aGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBuZWVkcyB0aGUgdG90YWwuXG4gICAgICAvLyBNdXN0IGluY2x1ZGUgcGFyZW50T3JnSWQgc28gYHRvdGFsYCBtYXRjaGVzIHRoZSB3aWRlbmVkIGRhdGEgc2V0LlxuICAgICAgaWYgKGluY2x1ZGVUb3RhbCkge1xuICAgICAgICBjb25zdCBiYXNlQ29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICAgICAgY29uc3QgW2NvdW50UmVzdWx0XSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAgIC53aGVyZShhbmQoLi4uYmFzZUNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKTtcbiAgICAgICAgcmVzdWx0LnRvdGFsID0gY291bnRSZXN1bHQ/LmNvdW50IHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29sdW1uIHNlbGVjdGlvbiBtYXAgZm9yIHNwYXJzZSBmaWVsZHNldHMuXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCBzZWxlY3QgaWYgbm8gbWF0Y2hpbmcgY29sdW1ucyBmb3VuZC5cbiAgICpcbiAgICogYHNvcnRCeWAgKHdoZW4gc2V0KSBpcyBhbHdheXMgZm9sZGVkIGludG8gdGhlIHByb2plY3Rpb24gZXZlbiBpZiB0aGUgY2FsbGVyJ3NcbiAgICogYGZpZWxkc2Agb21pdHMgaXQg4oCUIGN1cnNvciBwYWdpbmF0aW9uIHJlYWRzIHRoZSBuZXh0IGN1cnNvciBmcm9tIHRoZSBzb3J0XG4gICAqIGNvbHVtbidzIHZhbHVlIG9uIHRoZSBsYXN0IHJvdywgc28gZHJvcHBpbmcgaXQgZnJvbSB0aGUgU0VMRUNUIHdvdWxkIHlpZWxkIGFuXG4gICAqIHVuZGVmaW5lZCBjdXJzb3IgYW5kIHN0YWxsIHBhZ2luZy4gSW5jbHVkZWQgdGhlIHNhbWUgd2F5IGBpZGAgYWx3YXlzIGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZpZWxkU2VsZWN0KGZpZWxkczogc3RyaW5nW10sIHNvcnRCeT86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgaWQgZm9yIGVudGl0eSBpZGVudGl0eVxuICAgIGNvbHVtbnMuaWQgPSB0aGlzLmNvbHMuaWQ7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkID09PSAnaWQnKSBjb250aW51ZTsgLy8gQWxyZWFkeSBpbmNsdWRlZFxuICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xzW2ZpZWxkXTtcbiAgICAgIGlmIChjb2wpIGNvbHVtbnNbZmllbGRdID0gY29sO1xuICAgIH1cblxuICAgIC8vIEd1YXJhbnRlZSB0aGUgc29ydCBjb2x1bW4gaXMgc2VsZWN0YWJsZSBzbyB0aGUgbmV4dCBjdXJzb3IgY2FuIGJlIHJlYWRcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdyAoc2VlIGZpbmRQYWdpbmF0ZWQpLiBOby1vcCBpZiBhbHJlYWR5IGFkZGVkIG9yIHVua25vd24uXG4gICAgaWYgKHNvcnRCeSAmJiBzb3J0QnkgIT09ICdpZCcgJiYgIShzb3J0QnkgaW4gY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHNvcnRDb2wgPSB0aGlzLmNvbHNbc29ydEJ5XTtcbiAgICAgIGlmIChzb3J0Q29sKSBjb2x1bW5zW3NvcnRCeV0gPSBzb3J0Q29sO1xuICAgIH1cblxuICAgIC8vIEF0IG1pbmltdW0gd2UnbGwgaGF2ZSB7IGlkIH0sIHdoaWNoIGlzIHZhbGlkXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB0aGUgY291bnQgdG8gdGhlIHBhcmVudCBvcmcnc1xuICAgKiAgIHB1YmxpYyByb3dzLiBNVVNUIG1pcnJvciBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgJ3Mgd2lkZW5pbmcgKHNhbWVcbiAgICogICBgYnVpbGRDb25kaXRpb25zYCBhcmdzICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgdmlhIGBydW5SZWFkYCkgc28gYSBwYWdlZFxuICAgKiAgIGxpc3QncyBgdG90YWxgIG1hdGNoZXMgdGhlIHJvd3MgYSB3aWRlbmVkIGBmaW5kKClgIHJldHVybnMg4oCUIG90aGVyd2lzZSB0aGVcbiAgICogICBjb3VudCBvbWl0cyB0aGUgcGFyZW50J3Mgcm93cyBhbmQgcmVwb3J0cyBhIG5hcnJvd2VyIHRvdGFsIHRoYW4gdGhlIGRhdGEgc2V0LlxuICAgKi9cbiAgYXN5bmMgY291bnQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHQ/LmNvdW50IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNpbmdsZSBlbnRpdHkgYnkgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gRW50aXR5IElEXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2lkZW4gdmlzaWJpbGl0eSB0byB0aGUgcGFyZW50XG4gICAqICAgb3JnJ3MgcHVibGljIHJvd3MgKHNvIGEgdGVhbSBjYW4gZmV0Y2ggYSBwYXJlbnQncyBwdWJsaWMgZW50aXR5IGJ5IGlkKS5cbiAgICogICBTYW1lIG9wdC1pbiArIHN5c2FkbWluLXNjb3BlZCByZWFkIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGA7IHRoZVxuICAgKiAgIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSBpcyB0aGUgYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuXG4gICAqL1xuICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgIC8vIEV4YWN0IGlkIOKAlCBgZmluZEJ5SWRgIG1lYW5zIFRIRSByb3cgd2l0aCB0aGlzIGlkLCBub3QgYSBwcmVmaXggbWF0Y2guIFRoZVxuICAgIC8vIHNoYXJlZCBgYnVpbGRJZEZpbHRlcmAgcHJlZml4LW1hdGNoZXMgbm9uLWZ1bGwtVVVJRCB2YWx1ZXMgKGEgbGlzdC1zZWFyY2hcbiAgICAvLyBmZWF0dXJlKSwgd2hpY2ggaGVyZSB3b3VsZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGZpcnN0IHByZWZpeCBoaXQgZm9yIGFcbiAgICAvLyBwYXJ0aWFsIGlkOyBwaW4gaXQgdG8gZXhhY3Qgc28gYSBtYWxmb3JtZWQgaWQgcmV0dXJucyBudWxsLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLy8gTXV0YXRpb24gb3BlcmF0aW9uc1xuXG4gIC8qKlxuICAgKiBEZWZlbnNlLWluLWRlcHRoIHRlbmFudCBzdGFtcC4gUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlLCBzbyB0aGUgYXBwIGxheWVyXG4gICAqIGlzIHRoZSBvbmx5IHRlbmFudCBnYXRlIG9uIHdyaXRlcy4gQSBOT04tc3lzYWRtaW4gY2FsbGVyIG1heSBvbmx5IHdyaXRlIGludG9cbiAgICogaXRzIE9XTiBvcmcsIHNvIHBpbiB0aGUgcm93IHRvIHRoZSB0cnVzdGVkIHRlbmFudC1jb250ZXh0IG9yZy5cbiAgICpcbiAgICogVGhlIHN0YW1wIGZpcmVzIHdoZW5ldmVyIHRoZSBwYXlsb2FkJ3MgYG9yZ0lkYCBkaWZmZXJzIGZyb20gdGhlIGNvbnRleHQgb3JnIOKAlFxuICAgKiB3aGljaCBjb3ZlcnMgQk9USCBhIGZvcmdlZC9taXNtYXRjaGVkIGBkYXRhLm9yZ0lkYCBBTkQgYW4gQUJTRU5UIG9uZS4gVGhlXG4gICAqIGFic2VudCBjYXNlIGlzIHRoZSBpbXBvcnRhbnQgdGVuYW50LWJvdW5kYXJ5IGZpeDogdGhlIGBvcmdfaWRgIGNvbHVtbiBERUZBVUxUc1xuICAgKiB0byBgU1lTVEVNX09SR19JRGAgKHNjaGVtYS9waXBlbGluZS50cywgc2NoZW1hL3BsdWdpbi50cyksIHNvIGFuIGluc2VydCB0aGF0XG4gICAqIG9taXRzIGBvcmdJZGAgd291bGQgb3RoZXJ3aXNlIGxhbmQgdGhlIHRlbmFudCdzIHJvdyBpbiB0aGUgcHVibGljIHN5c3RlbVxuICAgKiBjYXRhbG9nIOKAlCBhIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4uIEFsd2F5cyBpbmplY3RpbmcgYGN0eC5vcmdJZGAgY2xvc2VzIGl0LlxuICAgKlxuICAgKiBTeXNhZG1pbiAoYW5kIG91dC1vZi1jb250ZXh0IHdvcmtlci9zeXN0ZW0gcGF0aHMsIHdoZXJlIGBnZXRUZW5hbnRDb250ZXh0KClgXG4gICAqIGlzIHVuZGVmaW5lZCkga2VlcCB0aGUgc3VwcGxpZWQgb3JnLCBtYXRjaGluZyB0aGUgUkxTIHBvbGljeVxuICAgKiBgY3VycmVudF9pc19zeXNhZG1pbigpIE9SIG9yZ19pZCA9IGN1cnJlbnRfb3JnX2lkKClgLlxuICAgKi9cbiAgLy8gR2VuZXJpYyBvdmVyIHRoZSBwYXlsb2FkIHNoYXBlIHNvIEJPVEggdGhlIGNyZWF0ZSAoYFRJbnNlcnRgKSBhbmQgdXBkYXRlXG4gIC8vIChgUGFydGlhbDxUVXBkYXRlPmApIGNhbGwgc2l0ZXMgdXNlIGl0IHdpdGhvdXQgdGhlIGBhcyB1bmtub3duIGFzIFRJbnNlcnRgXG4gIC8vIHJvdW5kLXRyaXAgdGhleSBwcmV2aW91c2x5IG5lZWRlZCDigJQgdGhlIG9yZy1zdGFtcCBsb2dpYyBpcyBpZGVudGljYWwgZm9yXG4gIC8vIGVpdGhlciBzaGFwZSAoaXQgb25seSB0b3VjaGVzIHRoZSBgb3JnSWRgIGtleSkuXG4gIHByb3RlY3RlZCBlbmZvcmNlT3JnSWQ8VD4oZGF0YTogVCwgaXNDcmVhdGUgPSBmYWxzZSk6IFQge1xuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvLyBSZWZ1c2UgYSBjb250ZXh0LWxlc3MsIG9yZ0lkLWxlc3MgSU5TRVJUIG9uIGFuIG9yZy1zY29wZWQgZW50aXR5OiB0aGUgYG9yZ0lkYFxuICAgIC8vIGNvbHVtbiBkZWZhdWx0cyB0byBTWVNURU1fT1JHX0lELCBzbyBzdWNoIGEgcm93IHdvdWxkIHNpbGVudGx5IGxhbmQgaW4gdGhlXG4gICAgLy8gcHVibGljIGNyb3NzLW9yZyBjYXRhbG9nLiBBIGJhY2tncm91bmQgam9iIHRoYXQgZm9yZ290IGBydW5XaXRoVGVuYW50Q29udGV4dGBcbiAgICAvLyAoYW5kIGRpZG4ndCBwYXNzIGFuIGV4cGxpY2l0IG9yZ0lkKSBtdXN0IGZhaWwgbG91ZGx5LCBub3QgbGVhayBpbnRvIGBzeXN0ZW1gLlxuICAgIC8vIChTeXNhZG1pbi9zZWVkIHdyaXRlcyBjYXJyeSBhIGNvbnRleHQgb3IgYW4gZXhwbGljaXQgb3JnSWQsIHNvIHRoZXkgcGFzcy4pXG4gICAgaWYgKGlzQ3JlYXRlICYmICFjdHggJiYgZC5vcmdJZCA9PSBudWxsICYmIHRoaXMuY29scy5vcmdJZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5jcmVhdGUgcmVxdWlyZXMgYW4gb3JnSWQgKG5vIHRlbmFudCBjb250ZXh0IGFuZCBub25lIHN1cHBsaWVkKSDigJQgcmVmdXNpbmcgdG8gZGVmYXVsdCB0byB0aGUgc3lzdGVtIG9yZ2ApO1xuICAgIH1cbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCAmJiBkLm9yZ0lkICE9PSBjdHgub3JnSWQpIHtcbiAgICAgIC8vIERpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgdGhhdCByZWFjaCBoZXJlIHNvIHRoZSBsb2cgc3RheXMgdXNlZnVsIGFuZFxuICAgICAgLy8gcXVpZXQ6IGEgUFJFU0VOVC1idXQtbWlzbWF0Y2hlZCBgb3JnSWRgIGlzIGFuIGFjdHVhbCBvdmVycmlkZSBhdHRlbXB0XG4gICAgICAvLyAod2FybiksIHdoaWxlIGFuIEFCU0VOVCBgb3JnSWRgIGlzIHRoZSBjb21tb24gbm9ybWFsLXdyaXRlIHBhdGggdGhhdCBqdXN0XG4gICAgICAvLyBuZWVkcyB0aGUgZGVmYXVsdCBzdGFtcCAoZGVidWcpIOKAlCBsb2dnaW5nIHRoYXQgYXQgd2FybiBmbG9vZHMgdGhlIGxvZyBvblxuICAgICAgLy8gZXZlcnkgd3JpdGUgdGhhdCBvbWl0cyBvcmdJZC5cbiAgICAgIGNvbnN0IG1ldGEgPSB7IHN1cHBsaWVkOiAnb3JnSWQnIGluIGQgPyBkLm9yZ0lkIDogdW5kZWZpbmVkLCBlbmZvcmNlZDogY3R4Lm9yZ0lkIH07XG4gICAgICBpZiAoJ29yZ0lkJyBpbiBkKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdDcnVkU2VydmljZTogb3ZlcnJpZGluZyBtaXNtYXRjaGVkIG9yZyBvbiB3cml0ZScsIG1ldGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDcnVkU2VydmljZTogc3RhbXBpbmcgdGVuYW50LWNvbnRleHQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5kLCBvcmdJZDogY3R4Lm9yZ0lkIH0gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IFRJbnNlcnQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhLCAvKiBpc0NyZWF0ZSAqLyB0cnVlKTtcbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXMoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgICAgLy8gUkVTVVJSRUNUIG9uIHJlLWNyZWF0ZTogYGRlbGV0ZWAgc29mdC1kZWxldGVzIChpc0FjdGl2ZT1mYWxzZSArIGRlbGV0ZWRBdC9cbiAgICAgICAgICAvLyBkZWxldGVkQnkgc2V0KSwgYnV0IHRoZSB1bmlxdWUgY29uc3RyYWludCBrZWVwcyB0aGUgdG9tYnN0b25lZCByb3csIHNvIGFcbiAgICAgICAgICAvLyByZS1jcmVhdGUgd2l0aCB0aGUgc2FtZSBjb25mbGljdCBrZXkgbGFuZHMgaGVyZS4gV2l0aG91dCByZXNldHRpbmcgdGhlc2UsXG4gICAgICAgICAgLy8gdGhlIHJvdydzIGJvZHkgdXBkYXRlcyBidXQgaXQgc3RheXMgc29mdC1kZWxldGVkIGFuZCBuZXZlciByZWFwcGVhcnNcbiAgICAgICAgICAvLyAocmVhZHMgZGVmYXVsdCB0byBpc0FjdGl2ZT10cnVlKS4gTWF0Y2hlcyB0aGUgcGlwZWxpbmUvcGx1Z2luIG92ZXJyaWRlcy5cbiAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICAgIGRlbGV0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtdWx0aXBsZSBlbnRpdGllcyBpbiBhIHNpbmdsZSBiYXRjaCBpbnNlcnQuXG4gICAqIFVzZXMgdXBzZXJ0IChvbkNvbmZsaWN0RG9VcGRhdGUpIOKAlCBhbGwgcm93cyBhcmUgaW5zZXJ0ZWQgaW4gb25lIHF1ZXJ5IHBlciBjaHVuay5cbiAgICogQ2h1bmtzIG9mIDEwMCB0byBzdGF5IHdpdGhpbiBQb3N0Z3JlU1FMIHBhcmFtZXRlciBsaW1pdHMuXG4gICAqL1xuICAvKipcbiAgICogQnVpbGQgdGhlIGBvbkNvbmZsaWN0RG9VcGRhdGVgIFNFVCBmb3IgYSBidWxrIHVwc2VydC4gVW5saWtlIGEgc2luZ2xlLXJvd1xuICAgKiBjcmVhdGUgKHdoaWNoIGNhbiBzcHJlYWQgdGhlIG9uZSByb3cncyBkYXRhKSwgYSBiYXRjaGVkIGluc2VydCBoYXMgbWFueSByb3dzLFxuICAgKiBzbyBlYWNoIHVwZGF0YWJsZSBjb2x1bW4gaXMgd3JpdHRlbiBmcm9tIGBleGNsdWRlZC4qYCAodGhlIHdvdWxkLWJlLWluc2VydGVkXG4gICAqIHZhbHVlKSDigJQgb3RoZXJ3aXNlIGFuIGV4aXN0aW5nIHJvdydzIGZpZWxkcyBhcmUgc2lsZW50bHkgZGlzY2FyZGVkIGFuZCBvbmx5XG4gICAqIHRpbWVzdGFtcHMgYnVtcC4gU2tpcHMgaWRlbnRpdHkvaW1tdXRhYmxlIChgaWRgLCBgY3JlYXRlZEF0YCwgYGNyZWF0ZWRCeWApXG4gICAqIGFuZCB0aGUgY29uZmxpY3QtdGFyZ2V0IGNvbHVtbnM7IGB1cGRhdGVkQXRgL2B1cGRhdGVkQnlgIGdldCB0aGUgZnJlc2ggdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEJ1bGtVcHNlcnRTZXQobm93OiBEYXRlLCB1c2VyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29uZmxpY3ROYW1lcyA9IG5ldyBTZXQodGhpcy5jb25mbGljdFRhcmdldC5tYXAoKGMpID0+IChjIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZSkpO1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNvbF0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKSkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoY29sIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICAgIGlmIChrZXkgPT09ICdpZCcgfHwga2V5ID09PSAnY3JlYXRlZEF0JyB8fCBrZXkgPT09ICdjcmVhdGVkQnknIHx8IGNvbmZsaWN0TmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09ICd1cGRhdGVkQXQnKSB7IHNldFtrZXldID0gbm93OyBjb250aW51ZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRCeScpIHsgc2V0W2tleV0gPSB1c2VyOyBjb250aW51ZTsgfVxuICAgICAgc2V0W2tleV0gPSBzcWxgZXhjbHVkZWQuJHtzcWwuaWRlbnRpZmllcihuYW1lKX1gO1xuICAgIH1cbiAgICAvLyBSRVNVUlJFQ1Qgb24gYnVsayByZS1jcmVhdGUgKG1hdGNoZXMgdGhlIHNpbmdsZS1yb3cgY3JlYXRlKTogcmVzZXQgdGhlXG4gICAgLy8gc29mdC1kZWxldGUgY29sdW1ucyBleHBsaWNpdGx5IHJhdGhlciB0aGFuIHJlbHkgb24gYGV4Y2x1ZGVkLipgICsgY29sdW1uXG4gICAgLy8gZGVmYXVsdHMsIHNvIGEgcmUtY3JlYXRlZCBzYW1lLWtleSByb3cgaXMgYWx3YXlzIHJlYWN0aXZhdGVkLCBub3QgbGVmdFxuICAgIC8vIHRvbWJzdG9uZWQuIEFsbCBDcnVkU2VydmljZSBlbnRpdGllcyBjYXJyeSB0aGVzZSAoZGVsZXRlKCkgc2V0cyBhbGwgdGhyZWUpLlxuICAgIHNldC5pc0FjdGl2ZSA9IHRydWU7XG4gICAgc2V0LmRlbGV0ZWRBdCA9IG51bGw7XG4gICAgc2V0LmRlbGV0ZWRCeSA9IG51bGw7XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtDcmVhdGUoaXRlbXM6IFRJbnNlcnRbXSwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAxMDA7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlcklkIHx8ICdzeXN0ZW0nO1xuICAgIGNvbnN0IGNvbmZsaWN0U2V0ID0gdGhpcy5idWlsZEJ1bGtVcHNlcnRTZXQobm93LCB1c2VyKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBhbGxDcmVhdGVkOiBURW50aXR5W10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGl0ZW1zLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY2h1bmsubWFwKGRhdGEgPT4gKHtcbiAgICAgICAgICAuLi50aGlzLmVuZm9yY2VPcmdJZChkYXRhKSxcbiAgICAgICAgICBjcmVhdGVkQnk6IHVzZXIsXG4gICAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICB9IGFzIGFueSkpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0eFxuICAgICAgICAgIC5pbnNlcnQodGhpcy5zY2hlbWEpXG4gICAgICAgICAgLnZhbHVlcyh2YWx1ZXMpXG4gICAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuY29uZmxpY3RUYXJnZXQgYXMgYW55LFxuICAgICAgICAgICAgc2V0OiBjb25mbGljdFNldCBhcyBhbnksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKTtcblxuICAgICAgICBhbGxDcmVhdGVkLnB1c2goLi4uY3JlYXRlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxDcmVhdGVkO1xuICAgIH0pO1xuXG4gICAgLy8gUnVuIGhvb2tzIGluIHBhcmFsbGVsIGJ1dCBhd2FpdCBhbGwgYmVmb3JlIHJldHVybmluZyBzbyBhIHN1YnNlcXVlbnRcbiAgICAvLyByZWFkIGluIHRoZSBzYW1lIHJlcXVlc3Qgc2VlcyBhIGNvaGVyZW50IHBvc3Qtd3JpdGUgdmlldy5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJlc3VsdHMubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJDcmVhdGUoZW50aXR5LCB1c2VySWQpLmNhdGNoKGVyciA9PlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdmlzaWJpbGl0eWAgcHJlZGljYXRlIGZvciBhIGJ1bGsgc29mdC1kZWxldGUsIG1pcnJvcmluZ1xuICAgKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2Vzc2AgcnVuZyBmb3IgcnVuZyBzbyBidWxrIGFuZCBzaW5nbGUtcm93IGRlbGV0ZVxuICAgKiBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNhbGxlciBtYXkgcmVtb3ZlLlxuICAgKlxuICAgKiBSZXR1cm5zIG5vIGNvbmRpdGlvbiBhdCBhbGwgZm9yIGEgc3lzdGVtIGFkbWluLCBvciBmb3IgYW4gZW50aXR5IHdpdGggbm9cbiAgICogYHZpc2liaWxpdHlgIGNvbHVtbiAobm90aGluZyB0byBnYXRlIG9uKS5cbiAgICovXG4gIHByaXZhdGUgdmlzaWJpbGl0eURlbGV0ZUNvbmRpdGlvbnMoXG4gICAgYWNjZXNzOiB7IGlzU3lzdGVtQWRtaW46IGJvb2xlYW47IGNhblB1Ymxpc2g6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBhY2Nlc3NDb2w/OiBBbnlDb2x1bW4sXG4gICAgY3JlYXRlZEJ5Q29sPzogQW55Q29sdW1uLFxuICApOiBTUUxbXSB7XG4gICAgaWYgKCFhY2Nlc3NDb2wpIHJldHVybiBbXTtcbiAgICBpZiAoIWFjY2VzcyB8fCBhY2Nlc3MuaXNTeXN0ZW1BZG1pbikgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcnVuZ3M6IFNRTFtdID0gW2VxKGFjY2Vzc0NvbCwgJ29yZycpXTtcbiAgICAvLyBgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkuIFdpdGggbm8gYXV0aG9yIGNvbHVtbiBvciBubyBjYWxsZXIgaWRlbnRpdHkgd2VcbiAgICAvLyBjYW5ub3QgcHJvdmUgYXV0aG9yc2hpcCwgc28gdGhlIHJ1bmcgaXMgc2ltcGx5IG5vdCBvZmZlcmVkIChmYWlsIGNsb3NlZClcbiAgICAvLyByYXRoZXIgdGhhbiBtYXRjaGluZyBldmVyeSBwcml2YXRlIHJvdy5cbiAgICBpZiAoY3JlYXRlZEJ5Q29sICYmIHVzZXJJZCkge1xuICAgICAgcnVuZ3MucHVzaChhbmQoZXEoYWNjZXNzQ29sLCAncHJpdmF0ZScpLCBlcShjcmVhdGVkQnlDb2wsIHVzZXJJZCkpIGFzIFNRTCk7XG4gICAgfVxuICAgIGlmIChhY2Nlc3MuY2FuUHVibGlzaCkgcnVuZ3MucHVzaChlcShhY2Nlc3NDb2wsICdwdWJsaWMnKSk7XG5cbiAgICByZXR1cm4gW29yKC4uLnJ1bmdzKSBhcyBTUUxdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlIG11bHRpcGxlIGVudGl0aWVzIGJ5IElEcyBpbiBhIHNpbmdsZSBiYXRjaCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBidWxrRGVsZXRlKFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyJ3MgYXV0aG9yaXR5IG9uIHRoZSB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIuIE9taXQgKG9yXG4gICAgICogcGFzcyBgaXNTeXN0ZW1BZG1pbjogdHJ1ZWApIGZvciBhbiB1bnJlc3RyaWN0ZWQgZGVsZXRlLlxuICAgICAqXG4gICAgICogVGhpcyB1c2VkIHRvIGJlIGEgYHJlc3RyaWN0VG9Qcml2YXRlYCBib29sZWFuIHRoYXQgbmFycm93ZWQgdG9cbiAgICAgKiBgdmlzaWJpbGl0eSA9ICdwcml2YXRlJ2AuIFRoYXQgZW5jb2RlZCB0aGUgT0xEIHR3by1zdGF0ZSBtb2RlbDogc2luY2VcbiAgICAgKiBgcmVzb2x2ZVZpc2liaWxpdHlgIGRlZmF1bHRzIHBpcGVsaW5lcyBhbmQgcGx1Z2lucyB0byBgb3JnYCwgYW5kXG4gICAgICogc2luZ2xlLXJvdyBkZWxldGUgYWxsb3dzIGFuIGBvcmdgIHJvdyB3aXRoIHBsYWluIGA6d3JpdGVgLCBidWxrIGRlbGV0ZVxuICAgICAqIDQwMydkIHRoZSBub3JtYWwgY2FzZSDigJQgYW4gb3JnIGFkbWluIGNvdWxkIGRlbGV0ZSBhIHBpcGVsaW5lIG9uZSBhdCBhXG4gICAgICogdGltZSBidXQgbm90IGluIGJ1bGsuIFRoZSBydW5ncyBlbmZvcmNlZCBoZXJlIG1pcnJvclxuICAgICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBleGFjdGx5OlxuICAgICAqICAgLSBgcHJpdmF0ZWAg4oaSIGF1dGhvciBvbmx5IChgY3JlYXRlZEJ5ID09PSB1c2VySWRgKVxuICAgICAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZyAocGxhaW4gYDp3cml0ZWApXG4gICAgICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgdGhlIGVudGl0eSdzIHB1Ymxpc2ggcGVybWlzc2lvblxuICAgICAqL1xuICAgIGFjY2Vzcz86IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgfHwgJ3N5c3RlbSc7XG4gICAgLy8gT3duZXItc2NvcGUgdGhlIGJ1bGsgc29mdC1kZWxldGU6IGJ1aWxkQ29uZGl0aW9ucyBhbHNvIG1hdGNoZXMgc3lzdGVtL290aGVyXG4gICAgLy8gLW9yZyBQVUJMSUMgcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIHRlbmFudCBjb3VsZCBkZWxldGVcbiAgICAvLyBzaGFyZWQgcmVjb3JkcyBieSBpZC4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKVxuICAgIGNvbnN0IGFjY2Vzc0NvbCA9IHRoaXMuY29scy52aXNpYmlsaXR5O1xuICAgIGNvbnN0IGNyZWF0ZWRCeUNvbCA9IHRoaXMuY29scy5jcmVhdGVkQnk7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgIGluQXJyYXkodGhpcy5jb2xzLmlkLCBpZHMpLFxuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoe30gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQpLFxuICAgICAgLy8gVGVuYW50IGNvbHVtbiAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCkg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgICAgLy8gd3JpdGVDb25kaXRpb25zOyBubyBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IGlzIGFic2VudC5cbiAgICAgIC4uLihvcmdJZCA/IFtlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCldIDogW10pLFxuICAgICAgLi4udGhpcy52aXNpYmlsaXR5RGVsZXRlQ29uZGl0aW9ucyhhY2Nlc3MsIHVzZXJJZCwgYWNjZXNzQ29sLCBjcmVhdGVkQnlDb2wpLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGRlbGV0ZWQubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJEZWxldGUoZW50aXR5LmlkLCBlbnRpdHksIHVzZXJJZCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCAodG9tYnN0b25lZCkgZW50aXR5OiBjbGVhciBgaXNBY3RpdmVgL2BkZWxldGVkQXRgL1xuICAgKiBgZGVsZXRlZEJ5YC9gcHVyZ2VBZnRlcmAgc28gaXQgcmVhcHBlYXJzIGluIG5vcm1hbCByZWFkcy5cbiAgICpcbiAgICogTWF0Y2hlcyBPTkxZIGEgZ2VudWluZSB0b21ic3RvbmUg4oCUIGBpc0FjdGl2ZSA9IGZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGAg4oCUIHNvIGEgbWVyZWx5ICpkZWFjdGl2YXRlZCogcm93IChpc0FjdGl2ZT1mYWxzZSwgbm8gZGVsZXRlZEF0KSBpcyBuZXZlclxuICAgKiBzaWxlbnRseSBcInJlc3RvcmVkXCIuIFBpbm5lZCB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyAob3JnSWQtbGVzcyBzeXNhZG1pblxuICAgKiBjb250ZXh0IHNwYW5zIG9yZ3MsIG1hdGNoaW5nIGRlbGV0ZS91cGRhdGUpLiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBub1xuICAgKiBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqIEEgdW5pcXVlLWtleSBjb2xsaXNpb24gKGEgbGl2ZSByb3cgYWxyZWFkeSBob2xkcyB0aGUga2V5KSBzdXJmYWNlcyBhcyB0aGVcbiAgICogZHJpdmVyJ3MgdW5pcXVlLXZpb2xhdGlvbiBmb3IgdGhlIHJvdXRlIHRvIG1hcCB0byA0MDkg4oCUIGluIHByYWN0aWNlIHRoZVxuICAgKiB0b21ic3RvbmUgSVMgdGhlIGtleSBob2xkZXIsIHNvIHRoaXMgaXMgZGVmZW5zaXZlLlxuICAgKi9cbiAgLyoqIENvbmRpdGlvbnMgbWF0Y2hpbmcgYSBHRU5VSU5FIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJU1xuICAgKiAgTk9UIE5VTExgKSwgb3B0aW9uYWxseSBwaW5uZWQgdG8gYGlkYCBhbmQvb3IgYG9yZ0lkYC4gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICAgKiAgZm9yIHJlc3RvcmUvZmluZERlbGV0ZWRCeUlkL2ZpbmREZWxldGVkIHNvIHRoZSBcIndoYXQgaXMgYSB0b21ic3RvbmVcIiBydWxlXG4gICAqICBsaXZlcyBpbiBvbmUgcGxhY2UuICovXG4gIHByaXZhdGUgdG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZD86IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXG4gICAgICBlcSh0aGlzLmNvbHMuaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgIHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCxcbiAgICBdO1xuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBjb25kaXRpb25zLnVuc2hpZnQodGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDsgLy8gZW50aXR5IGhhcyBubyBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGVcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCBbcmVzdG9yZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAuLi4odGhpcy5jb2xzLnB1cmdlQWZ0ZXIgPyB7IHB1cmdlQWZ0ZXI6IG51bGwgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmIChyZXN0b3JlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUmVzdG9yZShpZCwgcmVzdG9yZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN0b3JlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGJ5IGlkICh0aGUgaW52ZXJzZSBvZiB0aGUgZGVmYXVsdCBgaXNBY3RpdmU9dHJ1ZWBcbiAgICogcmVhZHMpIOKAlCB1c2VkIGJ5IHJlc3RvcmUgcm91dGVzIHRvIGxvYWQgdGhlIHRvbWJzdG9uZSBmb3IgYWNjZXNzLWNvbnRyb2xcbiAgICogZ2F0aW5nIGJlZm9yZSByZXN0b3JpbmcuIFJldHVybnMgbnVsbCB1bmxlc3MgdGhlIHJvdyBleGlzdHMgQU5EIGlzIGEgZ2VudWluZVxuICAgKiB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZEJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFuIG9yZydzIHNvZnQtZGVsZXRlZCB0b21ic3RvbmVzIChgaXNBY3RpdmU9ZmFsc2VgICsgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGApLCBtb3N0LXJlY2VudGx5LWRlbGV0ZWQgZmlyc3Qg4oCUIHBvd2VycyB0aGUgXCJyZWNlbnRseSBkZWxldGVkXCIgcmVzdG9yZVxuICAgKiBVSS4gUmV0dXJucyBgW11gIGZvciBlbnRpdGllcyB3aXRob3V0IGEgc29mdC1kZWxldGUgbGlmZWN5Y2xlLiBgbGltaXRgIGlzXG4gICAqIGNsYW1wZWQgdG8gWzEsIDIwMF0gdG8ga2VlcCB0aGUgcmVzcG9uc2UgYm91bmRlZCAodGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLVxuICAgKiBkZWxldGVzIG9sZCB0b21ic3RvbmVzIGFueXdheSwgc28gdGhpcyBpcyBhIHNob3J0LCBzZWxmLWxpbWl0aW5nIGxpc3QpLlxuICAgKi9cbiAgYXN5bmMgZmluZERlbGV0ZWQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBvcHRzOiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgb3B0cy5saW1pdCA/PyA1MCksIDIwMCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQgPz8gMCk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkKTtcblxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAub3JkZXJCeShkZXNjKHRoaXMuY29scy5kZWxldGVkQXQhKSlcbiAgICAgIC5saW1pdChsaW1pdClcbiAgICAgIC5vZmZzZXQob2Zmc2V0KVxuICAgICAgLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGEgYmF0Y2ggb2YgdG9tYnN0b25lcyB3aG9zZSBwdXJnZSBkZWFkbGluZSBoYXMgcGFzc2VkXG4gICAqIChgZGVsZXRlZEF0IElTIE5PVCBOVUxMIEFORCBwdXJnZV9hZnRlciA8IG5vd2ApLiBCYXRjaGVkIChgbGltaXRgKSBzbyBhXG4gICAqIHN3ZWVwIHRpY2sgc3RheXMgYm91bmRlZDsgdGhlIHBlci1zZXJ2aWNlIHN3ZWVwIGxvb3BzIHVudGlsIGEgdGljayByZXR1cm5zXG4gICAqIGA8IGxpbWl0YC4gUnVucyBhY3Jvc3MgQUxMIG9yZ3MsIHNvIGNhbGxlcnMgTVVTVCBpbnZva2UgaXQgZnJvbSBhIHN5c2FkbWluXG4gICAqIHNjb3BlIChgcnVuU29mdERlbGV0ZVB1cmdlYCBlc3RhYmxpc2hlcyBvbmUpLiBgb25CZWZvcmVQdXJnZShpZHMsIHR4KWAgdGVhcnNcbiAgICogZG93biBkZXBlbmRlbnRzIGxhY2tpbmcgT04gREVMRVRFIENBU0NBREUgaW5zaWRlIHRoZSBzYW1lIHR4OyBgb25BZnRlclB1cmdlYFxuICAgKiBoYW5kbGVzIGV4dGVybmFsIHNpZGUtZWZmZWN0cy5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgcHVyZ2VkLiBOby1vcCAoMCkgZm9yIGVudGl0aWVzIHdpdGhvdXQgdGhlIGNvbHVtbnMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0IHx8ICF0aGlzLmNvbHMucHVyZ2VBZnRlcikgcmV0dXJuIDA7XG5cbiAgICBjb25zdCBwdXJnZWRJZHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkb29tZWQgPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gdGhlIGAuc2V0KClgXG4gICAgICAgIC8vIGNhc3RzIGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgd29yayBhcm91bmQpLiBSZXN1bHQgaXMgcmUtdHlwZWQgYmVsb3cuXG4gICAgICAgIC5zZWxlY3QoeyBpZDogdGhpcy5jb2xzLmlkIGFzIGFueSB9KVxuICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLndoZXJlKGFuZChzcWxgJHt0aGlzLmNvbHMuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIHNxbGAke3RoaXMuY29scy5wdXJnZUFmdGVyfSA8ICR7bm93fWApKVxuICAgICAgICAubGltaXQobGltaXQpXG4gICAgICAgIC50aGVuKHIgPT4gKHIgYXMgQXJyYXk8eyBpZDogdW5rbm93biB9PikubWFwKGQgPT4gU3RyaW5nKGQuaWQpKSk7XG5cbiAgICAgIGlmIChkb29tZWQubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBtdXN0IGhhcHBlbiBpbnNpZGUgdGhlIHNhbWUgdHggc28gYSBGSy1ibG9ja2luZyBjaGlsZFxuICAgICAgLy8gY2FuJ3Qgc3RyYW5kIHRoZSBwYXJlbnQuIEEgdGhyb3cgaGVyZSBhYm9ydHMgdGhpcyBiYXRjaCAocmV0cmllZCBuZXh0IHRpY2spLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKGRvb21lZCwgdHgpO1xuXG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBkb29tZWQpKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKHB1cmdlZElkcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uLWRlbWFuZCBoYXJkLWRlbGV0ZSBvZiBhIFNJTkdMRSB0b21ic3RvbmUgYnkgaWQg4oCUIHRoZSBtYW51YWwgY291bnRlcnBhcnRcbiAgICogdG8gdGhlIHJldGVudGlvbiBzd2VlcCdzIGBwdXJnZUV4cGlyZWRgLiBQZXJtYW5lbnRseSByZW1vdmVzIHRoZSByb3cgT05MWVxuICAgKiB3aGVuIGl0IGlzIGEgZ2VudWluZSB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCksXG4gICAqIG9wdGlvbmFsbHkgcGlubmVkIHRvIGBvcmdJZGAgKGFuIG9yZ0lkLWxlc3Mgc3lzYWRtaW4gY29udGV4dCBzcGFucyBvcmdzLFxuICAgKiBtYXRjaGluZyByZXN0b3JlL2RlbGV0ZSkuIFJ1bnMgdGhlIHNhbWUgYG9uQmVmb3JlUHVyZ2VgIGRlcGVuZGVudCB0ZWFyZG93blxuICAgKiBpbnNpZGUgdGhlIHR4IGFuZCB0aGUgc2FtZSBgb25BZnRlclB1cmdlYCBzaWRlLWVmZmVjdHMgYXMgdGhlIHN3ZWVwLlxuICAgKlxuICAgKiBJZ25vcmVzIGBwdXJnZUFmdGVyYDogYSBtYW51YWwgcHVyZ2UgZmluYWxpemVzIGFuIGFscmVhZHktc29mdC1kZWxldGVkIGl0ZW1cbiAgICogaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHJldGVudGlvbiBkZWFkbGluZS4gUmV0dXJucyB0aGVcbiAgICogcHVyZ2VkIGlkLCBvciBudWxsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCB0b21ic3RvbmUgKGFscmVhZHkgYWN0aXZlLCBwdXJnZWQsXG4gICAqIG91dCBvZiBzY29wZSwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqL1xuICBhc3luYyBwdXJnZUJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHB1cmdlZElkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgW2Rvb21lZF0gPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gZWxzZXdoZXJlKS5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKCFkb29tZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBEZXBlbmRlbnQgdGVhcmRvd24gaW4gdGhlIHNhbWUgdHggKEZLLWJsb2NraW5nIGNoaWxkcmVuIGNhbid0IHN0cmFuZFxuICAgICAgLy8gdGhlIHBhcmVudCkg4oCUIGlkZW50aWNhbCB0byB0aGUgc3dlZXAncyBwZXItYmF0Y2ggcGF0aC5cbiAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVQdXJnZShbZG9vbWVkXSwgdHgpO1xuICAgICAgYXdhaXQgdHguZGVsZXRlKHRoaXMuc2NoZW1hKS53aGVyZShpbkFycmF5KHRoaXMuY29scy5pZCwgW2Rvb21lZF0pKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKFtwdXJnZWRJZF0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHVyZ2VkSWQ7XG4gIH1cbn1cbiJdfQ==
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc5Rjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksSUFBYTtJQUMxQyxPQUFPLElBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxPQUFPLElBQTJCLENBQUM7QUFDckMsQ0FBQztBQXlHRCxxRkFBcUY7QUFDckYsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxRQUF1QixFQUFFLEVBQVU7SUFDdkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMs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QU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENvbmZsaWN0RXJyb3IsIE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciwgREVGQVVMVF9QQUdFX0xJTUlULCBNQVhfUEFHRV9MSU1JVCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgb3IsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKiBUaGUgRHJpenpsZSB0cmFuc2FjdGlvbiBvYmplY3QgaGFuZGVkIHRvIGB3aXRoVGVuYW50VHhgIGNhbGxiYWNrcy4gUGFzc2VkIHRvXG4gKiAgYG9uQmVmb3JlUHVyZ2VgIHNvIGEgc3ViY2xhc3MncyBkZXBlbmRlbnQgdGVhcmRvd24gcnVucyBpbiB0aGUgU0FNRSBwdXJnZVxuICogIHRyYW5zYWN0aW9uIChhdG9taWMgd2l0aCB0aGUgcGFyZW50IERFTEVURSksIG5vdCBhIGZyZXNoIGNvbm5lY3Rpb24uICovXG5leHBvcnQgdHlwZSBDcnVkVHggPSBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgaXNEZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHNvcnRCeT86IHN0cmluZztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBXaGVuIHRydWUsIHJ1bnMgYSBzZXBhcmF0ZSBDT1VOVCgqKSBxdWVyeSB0byBpbmNsdWRlIGV4YWN0IHRvdGFsLiBEZWZhdWx0OiBmYWxzZS4gKi9cbiAgaW5jbHVkZVRvdGFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEtleXNldCBwYWdpbmF0aW9uOiB0aGUgb3BhcXVlIGBuZXh0Q3Vyc29yYCBvZiB0aGUgcHJldmlvdXMgcGFnZS4gQ29udGludWVzXG4gICAqIHN0cmljdGx5IGFmdGVyIHRoYXQgcm93IGluIChzb3J0QnksIGlkKSBvcmRlcjsgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBvZmZzZXRgLlxuICAgKi9cbiAgY3Vyc29yPzogc3RyaW5nO1xuICAvKiogU3BhcnNlIGZpZWxkc2V0OiBjb2x1bW4gbmFtZXMgdG8gc2VsZWN0LiBSZXR1cm5zIGFsbCBjb2x1bW5zIHdoZW4gb21pdHRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFnaW5hdGVkIHJlc3VsdCB3aXRoIG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVkUmVzdWx0PFQ+IHtcbiAgZGF0YTogVFtdO1xuICAvKiogVG90YWwgY291bnQgb2YgbWF0Y2hpbmcgZW50aXRpZXMuIE9ubHkgcHJlc2VudCB3aGVuIGluY2x1ZGVUb3RhbCBpcyB0cnVlLiAqL1xuICB0b3RhbD86IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgb2Zmc2V0OiBudW1iZXI7XG4gIGhhc01vcmU6IGJvb2xlYW47XG4gIC8qKiBPcGFxdWUgY3Vyc29yIGZvciB0aGUgbmV4dCBwYWdlLiBQcmVzZW50IG9ubHkgd2hlbiBgaGFzTW9yZWAuICovXG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA/PyBudWxsOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRQcm9qZWN0Q29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLnByb2plY3Q7IH1cbiAqICAgcHJvdGVjdGVkIGdldE9yZ0NvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5vcmdJZDsgfVxuICogfVxuICogYGBgXG4gKi9cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIHN1YmNsYXNzIHRhYmxlJ3MgY29sdW1ucyB0aGUgYmFzZSBjbGFzcyB0b3VjaGVzXG4gKiAgZGlyZWN0bHkuIGBpZGAvYGlzQWN0aXZlYC9gaXNEZWZhdWx0YCBhcmUgYWx3YXlzIHByZXNlbnQgb24gYSBDUlVEIGVudGl0eTtcbiAqICBgdmlzaWJpbGl0eWAgb25seSBvbiB2aXNpYmlsaXR5LWJlYXJpbmcgZW50aXRpZXM7IHRoZSBpbmRleCBzaWduYXR1cmVcbiAqICBjb3ZlcnMgZHluYW1pYyAoc3BhcnNlLWZpZWxkc2V0KSBjb2x1bW4gYWNjZXNzLiAqL1xuaW50ZXJmYWNlIENydWRDb2x1bW5zIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIHZpc2liaWxpdHk/OiBBbnlDb2x1bW47XG4gIC8qKiBBdXRob3IgY29sdW1uIOKAlCB0aGUgYHByaXZhdGVgIHJ1bmcgb2YgdGhlIHZpc2liaWxpdHkgbGFkZGVyIGlzIGF1dGhvci1vbmx5LiAqL1xuICBjcmVhdGVkQnk/OiBBbnlDb2x1bW47XG4gIC8vIFNvZnQtZGVsZXRlIGxpZmVjeWNsZSBjb2x1bW5zIChwcmVzZW50IG9uIHRvbWJzdG9uZS1iZWFyaW5nIGVudGl0aWVzIG9ubHk7XG4gIC8vIGByZXN0b3JlYC9gcHVyZ2VFeHBpcmVkYCBhcmUgbm8tb3BzIHdoZW4gYWJzZW50KS5cbiAgZGVsZXRlZEF0PzogQW55Q29sdW1uO1xuICBwdXJnZUFmdGVyPzogQW55Q29sdW1uO1xuICBba2V5OiBzdHJpbmddOiBBbnlDb2x1bW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBQcm9qZWN0aW9uIGFsaWFzIGNhcnJ5aW5nIHRoZSBzb3J0IGNvbHVtbidzIGV4YWN0IERCIHRleHQgZm9yIHRoZSBuZXh0IGN1cnNvci4gKi9cbmNvbnN0IENVUlNPUl9TT1JUX0tFWSA9ICdfX2N1cnNvclNvcnRLZXknO1xuXG4vKipcbiAqIE9wYXF1ZSBrZXlzZXQgY3Vyc29yOiB0aGUgbGFzdCByb3cncyBzb3J0IHZhbHVlIGFzIFBvc3RncmVzIFRFWFQgKGZ1bGxcbiAqIHByZWNpc2lvbiDigJQgYSBKUyBgRGF0ZWAgd291bGQgdHJ1bmNhdGUgYHRpbWVzdGFtcHR6YCBtaWNyb3NlY29uZHMgdG8gbXMsIHNvXG4gKiBgY3JlYXRlZF9hdCA+ICc8bXM+J2AgcmUtcmV0dXJucyBvciBza2lwcyByb3dzIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kKSBwbHVzXG4gKiBpdHMgYGlkYCBhcyB0aGUgdGllLWJyZWFrZXIuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUN1cnNvcihzb3J0VGV4dDogc3RyaW5nIHwgbnVsbCwgaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbc29ydFRleHQsIGlkXSksICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xufVxuXG4vKiogRGVjb2RlIGEgY3Vyc29yIHByb2R1Y2VkIGJ5IHtAbGluayBlbmNvZGVDdXJzb3J9OyBgbnVsbGAgd2hlbiBtYWxmb3JtZWQuICovXG5mdW5jdGlvbiBkZWNvZGVDdXJzb3IoY3Vyc29yOiBzdHJpbmcpOiB7IHNvcnRUZXh0OiBzdHJpbmcgfCBudWxsOyBpZDogc3RyaW5nIH0gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGN1cnNvciwgJ2Jhc2U2NHVybCcpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIGlmIChcbiAgICAgIEFycmF5LmlzQXJyYXkocGFyc2VkKSAmJiBwYXJzZWQubGVuZ3RoID09PSAyXG4gICAgICAmJiAocGFyc2VkWzBdID09PSBudWxsIHx8IHR5cGVvZiBwYXJzZWRbMF0gPT09ICdzdHJpbmcnKVxuICAgICAgJiYgdHlwZW9mIHBhcnNlZFsxXSA9PT0gJ3N0cmluZycgJiYgcGFyc2VkWzFdLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHJldHVybiB7IHNvcnRUZXh0OiBwYXJzZWRbMF0sIGlkOiBwYXJzZWRbMV0gfTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBVVUlEX1RFWFQgPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8qKiBQb3N0Z3JlcyBgdGltZXN0YW1wW3R6XTo6dGV4dGAgLyBgZGF0ZTo6dGV4dGAgKGFsc28gYWNjZXB0cyBJU08tODYwMSkuICovXG5jb25zdCBUSU1FU1RBTVBfVEVYVCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpbIFRdXFxkezJ9OlxcZHsyfSg/OjpcXGR7Mn0oPzpcXC5cXGR7MSw2fSk/KT8oPzpafFsrLV1cXGR7Mn0oPzo6P1xcZHsyfSk/KT8pPyQvO1xuY29uc3QgTlVNRVJJQ19URVhUID0gL14tP1xcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWy0rXT9cXGQrKT8kLztcblxuLyoqXG4gKiBXaGV0aGVyIGB0ZXh0YCBjYW4gYmUgY2FzdCB0byBgY29sdW1uYCdzIHR5cGUuIEEgZGVjb2RlZCBjdXJzb3IgaXMgc3RpbGxcbiAqIGNsaWVudCBpbnB1dDogYSB2YWx1ZSBQb3N0Z3JlcyBjYW4ndCBjYXN0IChhIG5vbi1VVUlEIGlkLCBhIGdhcmJhZ2VcbiAqIHRpbWVzdGFtcCkgZmFpbHMgdGhlIHdob2xlIHF1ZXJ5IHdpdGggYSA1MDAuIENvbHVtbiB0eXBlcyB0aGlzIGRvZXNuJ3Qga25vd1xuICogKHRleHQsIHZhcmNoYXIsIOKApikgYWNjZXB0IGFueSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FzdGFibGVUbyhjb2x1bW46IEFueUNvbHVtbiwgdGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgY29sdW1uVHlwZSwgZGF0YVR5cGUgfSA9IGNvbHVtbjtcbiAgY29uc3QgZW51bVZhbHVlcyA9IChjb2x1bW4gYXMgeyBlbnVtVmFsdWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfSkuZW51bVZhbHVlcztcbiAgaWYgKGNvbHVtblR5cGUgPT09ICdQZ1VVSUQnKSByZXR1cm4gVVVJRF9URVhULnRlc3QodGV4dCk7XG4gIGlmICgoY29sdW1uVHlwZSA9PT0gJ1BnRW51bUNvbHVtbicgfHwgY29sdW1uVHlwZSA9PT0gJ1BnRW51bU9iamVjdENvbHVtbicpICYmIGVudW1WYWx1ZXM/Lmxlbmd0aCkgcmV0dXJuIGVudW1WYWx1ZXMuaW5jbHVkZXModGV4dCk7XG4gIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnIHx8IGNvbHVtblR5cGUgPT09ICdQZ1RpbWVzdGFtcFN0cmluZycgfHwgY29sdW1uVHlwZSA9PT0gJ1BnRGF0ZVN0cmluZycpIHJldHVybiBUSU1FU1RBTVBfVEVYVC50ZXN0KHRleHQpO1xuICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRleHQgPT09ICd0cnVlJyB8fCB0ZXh0ID09PSAnZmFsc2UnO1xuICBpZiAoZGF0YVR5cGUgPT09ICdudW1iZXInIHx8IGRhdGFUeXBlID09PSAnYmlnaW50JykgcmV0dXJuIE5VTUVSSUNfVEVYVC50ZXN0KHRleHQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBLZXlzZXQgcHJlZGljYXRlIFwic3RyaWN0bHkgYWZ0ZXIgKHNvcnRUZXh0LCBpZClcIiBmb3IgYE9SREVSIEJZIHNvcnQgPGRpcj4sIGlkIDxkaXI+YFxuICogdW5kZXIgUG9zdGdyZXMnIGRlZmF1bHQgbnVsbCBwbGFjZW1lbnQgKEFTQyDihpIgTlVMTFMgTEFTVCwgREVTQyDihpIgTlVMTFMgRklSU1QpLlxuICogVGhlIHRleHQgdmFsdWUgaXMgYm91bmQgYXMgYSBwYXJhbWV0ZXIgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29sdW1uLCBzbyBQb3N0Z3Jlc1xuICogY2FzdHMgaXQgYmFjayB0byB0aGUgY29sdW1uJ3MgdHlwZSBhdCBmdWxsIHByZWNpc2lvbi5cbiAqL1xuZnVuY3Rpb24ga2V5c2V0QWZ0ZXIoXG4gIHNvcnRDb2x1bW46IEFueUNvbHVtbixcbiAgaWRDb2x1bW46IEFueUNvbHVtbixcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJyxcbiAgc29ydFRleHQ6IHN0cmluZyB8IG51bGwsXG4gIGlkOiBzdHJpbmcsXG4pOiBTUUwge1xuICBpZiAoc29ydENvbHVtbiA9PT0gaWRDb2x1bW4pIHtcbiAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYycgPyBzcWxgJHtpZENvbHVtbn0gPCAke2lkfWAgOiBzcWxgJHtpZENvbHVtbn0gPiAke2lkfWA7XG4gIH1cbiAgaWYgKHNvcnRPcmRlciA9PT0gJ2FzYycpIHtcbiAgICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICAgID8gc3FsYCgke3NvcnRDb2x1bW59IElTIE5VTEwgQU5EICR7aWRDb2x1bW59ID4gJHtpZH0pYFxuICAgICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPiAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA+ICR7aWR9KSBPUiAke3NvcnRDb2x1bW59IElTIE5VTEwpYDtcbiAgfVxuICByZXR1cm4gc29ydFRleHQgPT09IG51bGxcbiAgICA/IHNxbGAoJHtzb3J0Q29sdW1ufSBJUyBOT1QgTlVMTCBPUiAoJHtzb3J0Q29sdW1ufSBJUyBOVUxMIEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgXG4gICAgOiBzcWxgKCR7c29ydENvbHVtbn0gPCAke3NvcnRUZXh0fSBPUiAoJHtzb3J0Q29sdW1ufSA9ICR7c29ydFRleHR9IEFORCAke2lkQ29sdW1ufSA8ICR7aWR9KSlgO1xufVxuXG4vKipcbiAqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUsIHNoYXJlZCBhY3Jvc3NcbiAqIGV2ZXJ5IENydWRTZXJ2aWNlIGVudGl0eSAodW5pZmllZCBgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLCBkZWZhdWx0IDMwZCkuXG4gKiBTdGFtcGVkIGludG8gYHB1cmdlX2FmdGVyYCBhdCBkZWxldGUgdGltZTsgdGhlIHBlci1zZXJ2aWNlIHB1cmdlIHN3ZWVwIGhhcmQtXG4gKiBkZWxldGVzIHRvbWJzdG9uZXMgb25jZSBpdCBoYXMgcGFzc2VkLiBgMGAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcuXG4gKi9cbmNvbnN0IFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUyA9IE1hdGgubWF4KDAsIE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5TT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZUyA/PyAnMzAnLCAxMCkgfHwgMCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogVGhlIHNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gd2luZG93IGluIG1zIChgU09GVF9ERUxFVEVfUkVURU5USU9OX0RBWVNgLFxuICogIGRlZmF1bHQgMzBkOyAwIGRpc2FibGVzIHB1cmdlLWRlYWRsaW5lIHN0YW1waW5nKS4gRXhwb3NlZCBzbyBub24tQ3J1ZFNlcnZpY2VcbiAqICBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLiBwbGF0Zm9ybSdzIGhhbmQtcm9sbGVkIGRhc2hib2FyZC9hbGVydCBzZXJ2aWNlcylcbiAqICBzdGFtcCBgcHVyZ2VfYWZ0ZXJgIHdpdGggdGhlIFNBTUUgd2luZG93IHRoZSBDcnVkU2VydmljZSBlbnRpdGllcyB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gIHJldHVybiBTT0ZUX0RFTEVURV9SRVRFTlRJT05fTVM7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcnVkU2VydmljZTxcbiAgVEVudGl0eSBleHRlbmRzIEJhc2VFbnRpdHksXG4gIFRGaWx0ZXIsXG4gIFRJbnNlcnQsXG4gIFRVcGRhdGUsXG4+IHtcbiAgLyoqIERyaXp6bGUgc2NoZW1hIHRhYmxlIGZvciB0aGlzIGVudGl0eSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHNjaGVtYSgpOiBQZ1RhYmxlO1xuXG4gIC8qKlxuICAgKiBUeXBlZCBjb2x1bW4gdmlldyBvZiB7QGxpbmsgc2NoZW1hfS4gYFBnVGFibGVgIGV4cG9zZXMgbm8gc3RhdGljIGNvbHVtbnMsIHNvXG4gICAqIHRoZSBiYXNlIGNsYXNzIHByZXZpb3VzbHkgcmVhY2hlZCBmb3IgYCh0aGlzLnNjaGVtYSBhcyBhbnkpLmlkYCBldGMuIGF0IGVhY2hcbiAgICogdXNlOyBjZW50cmFsaXplIHRoYXQgc2luZ2xlIHVuYXZvaWRhYmxlIGNhc3QgaGVyZSBzbyBjYWxsZXJzIGdldCBzdHJ1Y3R1cmVkLFxuICAgKiB0eXBlZCBhY2Nlc3MgaW5zdGVhZC4gYHZpc2liaWxpdHlgIGlzIG9wdGlvbmFsIChub3QgZXZlcnkgZW50aXR5IGhhcyBpdClcbiAgICogYW5kIHRoZSBpbmRleCBzaWduYXR1cmUgY292ZXJzIGR5bmFtaWMgc3BhcnNlLWZpZWxkc2V0IGNvbHVtbiBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIGdldCBjb2xzKCk6IENydWRDb2x1bW5zIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgYXMgdW5rbm93biBhcyBDcnVkQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgZmlsdGVyaW5nIGVudGl0aWVzLlxuICAgKiBgcGFyZW50T3JnSWRgIChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBpcyBvcHRpb25hbCBhbmQgb25seSBob25vcmVkIGJ5XG4gICAqIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gcGFyZW50LWluaGVyaXRlZCB2aXNpYmlsaXR5IChlLmcuIHBsdWdpbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdO1xuXG4gIC8qKiBHZXQgdGhlIHNjaGVtYSBjb2x1bW4gZm9yIHNvcnRpbmcgYnkgZmllbGQgbmFtZSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U29ydENvbHVtbihzb3J0Qnk6IHN0cmluZyk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqIEdldCB0aGUgcHJvamVjdCBjb2x1bW4gZm9yIHNldERlZmF1bHQgc2NvcGluZyAobnVsbCBpZiBlbnRpdHkgaGFzIG5vIHByb2plY3Qgc2NvcGUpICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9qZWN0Q29sdW1uKCk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGVuYW50IG9yZy1pZCBjb2x1bW4uIFVzZWQgYm90aCB0byBzY29wZSBgc2V0RGVmYXVsdGAgYW5kIHRvIHBpblxuICAgKiBldmVyeSB3cml0ZSAodXBkYXRlL2RlbGV0ZS9idWxrRGVsZXRlKSB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyDigJQgc28gaXQgTVVTVFxuICAgKiBiZSB0aGUgdGVuYW50IGBvcmdJZGAgY29sdW1uLCBub3QgYSBkaXNwbGF5L25hbWUgY29sdW1uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9yZ0NvbHVtbigpOiBBbnlDb2x1bW47XG5cbiAgLyoqIFRoZSB1bmlxdWUtY29uc3RyYWludCBjb2x1bW5zIGEgY3JlYXRlIG11c3Qgbm90IGNvbmZsaWN0IG9uIChzZWUge0BsaW5rIGNyZWF0ZX0pLiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IGNvbmZsaWN0VGFyZ2V0KCk6IEFueUNvbHVtbltdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY3J1ZC1zZXJ2aWNlJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRmFpbCBmYXN0IGlmIGEgc3ViY2xhc3MgZG9lc24ndCBleHBvc2UgYSB0ZW5hbnQgb3JnIGNvbHVtbi4gVGhlIHdyaXRlXG4gICAgLy8gcGF0aHMgKHdyaXRlQ29uZGl0aW9ucyAvIGJ1bGtEZWxldGUpIHBpbiBtdXRhdGlvbnMgdG8gdGhlIGNhbGxlcidzIG93blxuICAgIC8vIG9yZyB0aHJvdWdoIGl0OyBhIG1pc3NpbmcgY29sdW1uIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhhdCBndWFyZCDigJQgYVxuICAgIC8vIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4g4oCUIHNvIGFzc2VydCBpdHMgcHJlc2VuY2UgdXAgZnJvbnQuXG4gICAgaWYgKHRoaXMuZ2V0T3JnQ29sdW1uKCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IGdldE9yZ0NvbHVtbigpIG11c3QgcmV0dXJuIHRoZSB0ZW5hbnQgb3JnIGNvbHVtbmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBjb25kaXRpb25zIGZvciBhIHNpbmdsZSBlbnRpdHkgYnkgSUQuXG4gICAqICBgcGFyZW50T3JnSWRgIHdpZGVucyB2aXNpYmlsaXR5IHRvIGEgcGFyZW50IG9yZydzIHB1YmxpYyByb3dzIChvcmcg4oaSIHRlYW1cbiAgICogIGhpZXJhcmNoeSkg4oCUIHNhbWUgb3B0LWluIHNlbWFudGljcyBhcyBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgLiBPbWl0dGVkIGJ5IHRoZVxuICAgKiAgd3JpdGUgcGF0aCAoYHdyaXRlQ29uZGl0aW9uc2ApLCB3aGljaCBtdXN0IHN0YXkgb3duLW9yZyBzY29wZWQuICovXG4gIHByaXZhdGUgaWRDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbmRpdGlvbnMoeyBpZCB9IGFzIHVua25vd24gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25kaXRpb25zIGZvciBhIE1VVEFUSU9OICh1cGRhdGUvZGVsZXRlKSBvZiBhIHNpbmdsZSBlbnRpdHkuXG4gICAqXG4gICAqIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGUgUkVBRCBhY2Nlc3MtY29udHJvbCBjbGF1c2UsIHdoaWNoIGFsc28gbWF0Y2hlc1xuICAgKiBzeXN0ZW0tb3JnIC8gb3RoZXItb3JnIFBVQkxJQyByZWNvcmRzIOKAlCBzbyB3aXRob3V0IGFuIGV4dHJhIG93bmVyc2hpcCBwaW4gYW55XG4gICAqIHRlbmFudCBjb3VsZCB1cGRhdGUgb3Igc29mdC1kZWxldGUgYW5vdGhlciBvcmcncyAob3IgdGhlIHN5c3RlbSBvcmcncykgcHVibGljXG4gICAqIHJlY29yZHMuIEFORCBhIHN0cmljdCBgb3JnSWQgPT09IGNhbGxlcmAgcHJlZGljYXRlOiB0aGUgcmVhZCBjbGF1c2Unc1xuICAgKiBwdWJsaWMtT1IgYnJhbmNoIHJlcXVpcmVzIGBvcmdfaWQgPSAnc3lzdGVtJ2AsIHdoaWNoIHRoZW4gY2FuJ3QgYmUgc2F0aXNmaWVkLFxuICAgKiBsZWF2aW5nIG9ubHkgb3duLW9yZyByb3dzLiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwcyBmdWxsIGFjY2Vzcy5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVDb25kaXRpb25zKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmlkQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIC8vIFBpbiB0aGUgbXV0YXRpb24gdG8gdGhlIGNhbGxlcidzIG93biBvcmcgdmlhIHRoZSB0ZW5hbnQgY29sdW1uXG4gICAgLy8gKGdldE9yZ0NvbHVtbiwgYXNzZXJ0ZWQgbm9uLW51bGwgaW4gdGhlIGNvbnN0cnVjdG9yKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgLy8gc2V0RGVmYXVsdCBhbmQgd2l0aG91dCB0aGUgb2xkIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgd2FzIGFic2VudC5cbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIC8vIEZvcmNlIEVYQUNUIGlkIGVxdWFsaXR5IG9uIHRoZSBtdXRhdGlvbiBwYXRoLiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlXG4gICAgLy8gbGlzdC1maWx0ZXIgY2xhdXNlLCB3aG9zZSBgYnVpbGRJZEZpbHRlcmAgUFJFRklYLW1hdGNoZXMgKGBpZDo6dGV4dCBMSUtFXG4gICAgLy8gJ3ZhbCUnYCkgYW55IG5vbi1mdWxsLVVVSUQgdmFsdWUg4oCUIHNvIGEgcGFydGlhbCBpZCAoYERFTEVURSAveC9hYmApIHdvdWxkXG4gICAgLy8gc29mdC1kZWxldGUvbXV0YXRlIEVWRVJZIG93bi1vcmcgcm93IHdob3NlIGlkIHN0YXJ0cyB3aXRoIGBhYmAgYW5kIHJlcG9ydFxuICAgIC8vIHRvdWNoaW5nIG9uZS4gQU5EaW5nIGFuIGV4YWN0IGBpZCA9IHZhbGAgY29sbGFwc2VzIHRoZSBwcmVmaXggY2xhdXNlIHRvIGF0XG4gICAgLy8gbW9zdCB0aGUgc2luZ2xlIGV4YWN0IHJvdzsgYSBtYWxmb3JtZWQvcGFydGlhbCBpZCB0aGVuIG1hdGNoZXMgbm90aGluZ1xuICAgIC8vICjihpIgNDA0IHZpYSB0aGUgY2FsbGVycycgYGlmICghZGVsZXRlZClgIGd1YXJkKSBpbnN0ZWFkIG9mIG1hc3MtbXV0YXRpbmcuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgLyoqIEV4YWN0IGlkIGVxdWFsaXR5LCBsb3dlci1jYXNlZCB0byBtYXRjaCBgYnVpbGRJZEZpbHRlcmAncyBmdWxsLVVVSUQgYnJhbmNoLlxuICAgKiAgYHNjaGVtYWAgaXMgdHlwZWQgYFBnVGFibGVgIChubyBzdGF0aWMgYC5pZGApLCBzbyBjYXN0IOKAlCBzYW1lIHBhdHRlcm4gdGhlXG4gICAqICBzb3J0L2RlZmF1bHQgaGVscGVycyB1c2UgZm9yIGNvbHVtbiBhY2Nlc3MuICovXG4gIHByaXZhdGUgZXhhY3RJZENvbmRpdGlvbihpZDogc3RyaW5nKTogU1FMIHtcbiAgICByZXR1cm4gZXEodGhpcy5jb2xzLmlkLCBTdHJpbmcoaWQpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgLy8gTGlmZWN5Y2xlIGhvb2tzIOKAlCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIHRvIHJlYWN0IHRvIG11dGF0aW9uc1xuICAvLyBUaGVzZSBhcmUgZmlyZS1hbmQtZm9yZ2V0OiBlcnJvcnMgYXJlIGxvZ2dlZCBidXQgbmV2ZXIgYmxvY2sgdGhlIGNhbGxlci5cblxuICAvKiogQ2FsbGVkIGFmdGVyIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyQ3JlYXRlKF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyB1cGRhdGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyVXBkYXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgc29mdC1kZWxldGVkICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyRGVsZXRlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgaXMgcmVzdG9yZWQgKHVuZG8gdGhlIGRlbGV0ZSkuIE92ZXJyaWRlXG4gICAqICBmb3IgZW50aXRpZXMgd2hvc2UgcmVzdG9yZSBoYXMgc2lkZS1lZmZlY3RzIChlLmcuIHJlLW5vdGlmeSkuIEJlc3QtZWZmb3J0LiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclJlc3RvcmUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIHdpdGggdGhlIGlkcyBhYm91dCB0byBiZSBoYXJkLXB1cmdlZCwgQkVGT1JFIHRoZSBkZWxldGUsIGluc2lkZSB0aGVcbiAgICogIHB1cmdlIHRyYW5zYWN0aW9uIChgdHhgKSDigJQgYSBzdWJjbGFzcyB0ZWFyaW5nIGRvd24gZGVwZW5kZW50cyB0aGF0IGxhY2sgT05cbiAgICogIERFTEVURSBDQVNDQURFIE1VU1QgdXNlIGB0eGAgc28gdGhlIHRlYXJkb3duIGlzIGF0b21pYyB3aXRoIHRoZSBwYXJlbnRcbiAgICogIERFTEVURSAoYW5kIGNhbid0IHNlbGYtZGVhZGxvY2sgYWdhaW5zdCBpdHMgcm93IGxvY2tzKS4gVGhyb3dpbmcgYWJvcnRzIHRoYXRcbiAgICogIGJhdGNoJ3MgcHVyZ2UgKHJvd3Mgc3RheSB0b21ic3RvbmVkLCByZXRyaWVkIG5leHQgdGljaykuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkJlZm9yZVB1cmdlKF9pZHM6IHN0cmluZ1tdLCBfdHg6IENydWRUeCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIHJvd3MgYXJlIGhhcmQtcHVyZ2VkLCBmb3IgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzIChlLmcuIHBsdWdpblxuICAgKiAgaW1hZ2UgR0MpLiBCZXN0LWVmZm9ydDogZXJyb3JzIGFyZSBsb2dnZWQsIG5ldmVyIGJsb2NrIHRoZSBzd2VlcC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJQdXJnZShfaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZS4gRGVmYXVsdHMgdG8gdGhlXG4gICAqICBzaGFyZWQgYFNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTYDsgb3ZlcnJpZGUgcGVyIGVudGl0eSBmb3IgYSBiZXNwb2tlIHdpbmRvdy4gKi9cbiAgcHJvdGVjdGVkIGdldCBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gU09GVF9ERUxFVEVfUkVURU5USU9OX01TO1xuICB9XG5cbiAgLyoqIFRoZSBgcHVyZ2VfYWZ0ZXJgIHZhbHVlIHRvIHN0YW1wIG9uIGEgc29mdC1kZWxldGU6IGBub3cgKyByZXRlbnRpb25gLCBvciB0aGVcbiAgICogIHNwcmVhZC1mcmllbmRseSBlbXB0eSBvYmplY3Qgd2hlbiB0aGUgZW50aXR5IGhhcyBubyBgcHVyZ2VfYWZ0ZXJgIGNvbHVtbi5cbiAgICogIGBwcm90ZWN0ZWRgIHNvIHN1YmNsYXNzZXMgd2l0aCBoYW5kLXJvbGxlZCBzb2Z0LWRlbGV0ZSBwYXRocyAoZS5nLlxuICAgKiAgbWVzc2FnZS1zZXJ2aWNlJ3MgdGhyZWFkIGNhc2NhZGUgLyBzeXNhZG1pbiBtb2RlcmF0aW9uKSBzdGFtcCBpdCB0b28g4oCUIGFuXG4gICAqICB1bi1zdGFtcGVkIHRvbWJzdG9uZSBoYXMgTlVMTCBgcHVyZ2VfYWZ0ZXJgIGFuZCBpcyBuZXZlciBoYXJkLXB1cmdlZC4gKi9cbiAgcHJvdGVjdGVkIHB1cmdlQWZ0ZXJTdGFtcChub3c6IERhdGUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMucHVyZ2VBZnRlciB8fCB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcyA8PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHsgcHVyZ2VBZnRlcjogbmV3IERhdGUobm93LmdldFRpbWUoKSArIHRoaXMuc29mdERlbGV0ZVJldGVudGlvbk1zKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdoZW4gYSByZWFkIGlzIHdpZGVuZWQgdG8gYSBwYXJlbnQgb3JnIChgcGFyZW50T3JnSWRgXG4gICAqIHNldCksIHRoZSBwYXJlbnQncyByb3dzIGFyZSBvdXRzaWRlIHRoZSBjYWxsZXIncyBSTFMgc2NvcGUsIHNvIHRoZSByZWFkIG11c3RcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQg4oCUIHRoZSBhY2Nlc3MtY29udHJvbCBXSEVSRSBjbGF1c2UgKG93biArIHBhcmVudCArXG4gICAqIHN5c3RlbSBwdWJsaWMsIGJ1aWx0IHNlcnZlci1zaWRlIGZyb20gYSB0cnVzdGVkIEpXVCBjbGFpbSkgaXMgdGhlbiB0aGVcbiAgICogYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuIFdpdGhvdXQgYHBhcmVudE9yZ0lkYCBpdCBzdGF5cyBSTFMtc2NvcGVkLlxuICAgKlxuICAgKiBJTlZBUklBTlQgKHdoeSB0aGUgc3lzYWRtaW4gYnlwYXNzIGlzIHNhZmUpOiB0aGUgV0hFUkUgY2xhdXNlIGlzIGFsd2F5c1xuICAgKiBzZXJ2ZXItYnVpbHQgYnkgYGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZClgIGZyb20gdmFsdWVzXG4gICAqIGRlcml2ZWQgZnJvbSB0aGUgdmFsaWRhdGVkIEpXVCAoYG9yZ0lkYCA9IGFjdGl2ZSBvcmcsIGBwYXJlbnRPcmdJZGAgPSB0aGVcbiAgICogYWN0aXZlIG9yZydzIHBhcmVudCkuIE5vbmUgb2YgdGhlbSBpcyBhIHJhdyB1c2VyLXN1cHBsaWVkIHByZWRpY2F0ZSwgc28gdGhlXG4gICAqIGJ5cGFzcyBvbmx5IGV2ZXIgd2lkZW5zIHRoZSByZWFkIHRvIHRoZSBjYWxsZXIncyBvd24gc3VidHJlZSArIHN5c3RlbSBwdWJsaWNcbiAgICogcm93cyDigJQgaXQgY2FuIE5PVCBiZSBzdGVlcmVkIGF0IGFuIGFyYml0cmFyeSBvcmcuIE5PVEU6IHRoaXMgZG9lcyByZW1vdmUgdGhlXG4gICAqIFJMUyBiYWNrc3RvcCBmb3IgdGhlIHdpZGVuZWQgcmVhZDsgYSBzaW5nbGUtR1VDIGBhcHAub3JnX2lkYCBjYW4ndCBleHByZXNzXG4gICAqIHRoZSBcIm93biBPUiBwYXJlbnQgT1Igc3lzdGVtXCIgc2V0IHRoZSBwb2xpY3kgd291bGQgbmVlZCwgc28gcmVwbGFjaW5nIHRoZVxuICAgKiBieXBhc3Mgd291bGQgcmVxdWlyZSBhIHRlbmFuY3ktbGF5ZXIgY2hhbmdlIChlLmcuIGEgbXVsdGktb3JnIFJMUyBwb2xpY3kpLlxuICAgKiBEZWZlcnJlZCBkZWxpYmVyYXRlbHkg4oCUIGRvIG5vdCBzd2FwIHRoaXMgZm9yIGEgYmxhbmtldCBieXBhc3Mgd2l0aG91dFxuICAgKiByZS1jaGVja2luZyB0aGUgV0hFUkUgaXMgc3RpbGwgZnVsbHkgc2VydmVyLWJ1aWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBydW5SZWFkPFQ+KHBhcmVudE9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHBhcmVudE9yZ0lkID8gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgZm4pIDogZm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIG1hdGNoaW5nIGZpbHRlciBjcml0ZXJpYVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICovXG4gIGFzeW5jIGZpbmQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICByZXR1cm4gdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBGSVJTVCBlbnRpdHkgbWF0Y2hpbmcgYGZpbHRlcmAg4oCUIGEgYm91bmRlZCAoYExJTUlUIDFgKSB2YXJpYW50IG9mXG4gICAqIGBmaW5kYCBmb3IgdGhlIFwibWF0Y2ggYnkgZmlsdGVyLCB0YWtlIG9uZVwiIHJlYWQgcGF0aHMgKGUuZy4gYEdFVCAvZmluZGApLCBzb1xuICAgKiB0aGV5IGRvbid0IGBTRUxFQ1RgIGV2ZXJ5IG1hdGNoaW5nIG9yZyByb3cganVzdCB0byByZXR1cm4gYFswXWAuXG4gICAqL1xuICBhc3luYyBmaW5kRmlyc3QoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgd2l0aCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgZmluZFBhZ2luYXRlZChcbiAgICBmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sXG4gICAgb3JnSWQ/OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUXVlcnlPcHRpb25zID0ge30sXG4gICAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzdWx0PFRFbnRpdHk+PiB7XG4gICAgY29uc3QgeyBsaW1pdDogcmF3TGltaXQgPSBERUZBVUxUX1BBR0VfTElNSVQsIG9mZnNldCA9IDAsIHNvcnRCeSwgc29ydE9yZGVyID0gJ2FzYycsIGluY2x1ZGVUb3RhbCA9IGZhbHNlLCBjdXJzb3IsIGZpZWxkcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKE1hdGgubWF4KDEsIHJhd0xpbWl0KSwgTUFYX1BBR0VfTElNSVQpO1xuXG4gICAgLy8gVG90YWwsIGRldGVybWluaXN0aWMgb3JkZXI6IChzb3J0IGNvbHVtbiwgaWQpLiBgaWRgIGlzIHVuaXF1ZSwgc28gcm93cyB0aGF0XG4gICAgLy8gc2hhcmUgYSBzb3J0IHZhbHVlIGhhdmUgYSBzdGFibGUgcmVsYXRpdmUgb3JkZXIgYW5kIGEga2V5c2V0IGN1cnNvciBjYW5cbiAgICAvLyBuZXZlciBza2lwIG9yIHJlcGVhdCB0aGVtLiBBbiBhYnNlbnQgb3IgVU5LTk9XTiBgc29ydEJ5YCBvcmRlcnMgYnkgYGlkYFxuICAgIC8vIGFsb25lIOKAlCBhbiB1bmtub3duIHNvcnQgdXNlZCB0byBhZGQgbm8gV0hFUkUgYW5kIG5vIE9SREVSIEJZIHdoaWxlIHN0aWxsXG4gICAgLy8gZW1pdHRpbmcgYSBjdXJzb3IsIHNvIGEgY3Vyc29yIGNsaWVudCBsb29wZWQgb24gcGFnZSAxIGZvcmV2ZXIuXG4gICAgY29uc3QgaWRDb2x1bW4gPSB0aGlzLmNvbHMuaWQ7XG4gICAgY29uc3Qgc29ydENvbHVtbiA9IChzb3J0QnkgPyB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KSA6IG51bGwpID8/IGlkQ29sdW1uO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gZGVzYyA6IGFzYztcbiAgICBjb25zdCBvcmRlckJ5ID0gc29ydENvbHVtbiA9PT0gaWRDb2x1bW4gPyBbZGlyZWN0aW9uKGlkQ29sdW1uKV0gOiBbZGlyZWN0aW9uKHNvcnRDb2x1bW4pLCBkaXJlY3Rpb24oaWRDb2x1bW4pXTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGEgdmFsaWQgY3Vyc29yIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gQSBtYWxmb3JtZWQvdGFtcGVyZWQgY3Vyc29yIOKAlCBpbmNsdWRpbmcgd2VsbC1mb3JtZWQgSlNPTiB3aG9zZSB2YWx1ZXNcbiAgICAvLyBjYW4ndCBiZSBjYXN0IHRvIHRoZSBpZCAvIHNvcnQgY29sdW1uIHR5cGVzIOKAlCBpcyBpZ25vcmVkIChyZWFkcyBmcm9tIHRoZVxuICAgIC8vIHN0YXJ0KSBpbnN0ZWFkIG9mIHJlYWNoaW5nIFBvc3RncmVzIGFuZCBmYWlsaW5nIHRoZSBxdWVyeS5cbiAgICBjb25zdCByYXdDdXJzb3IgPSBjdXJzb3IgPyBkZWNvZGVDdXJzb3IoY3Vyc29yKSA6IG51bGw7XG4gICAgY29uc3QgZGVjb2RlZEN1cnNvciA9IHJhd0N1cnNvclxuICAgICAgJiYgaXNDYXN0YWJsZVRvKGlkQ29sdW1uLCByYXdDdXJzb3IuaWQpXG4gICAgICAvLyAoYW4gaWQtb25seSBvcmRlciBuZXZlciBiaW5kcyB0aGUgc29ydCB2YWx1ZSDigJQgc2VlIGtleXNldEFmdGVyKVxuICAgICAgJiYgKHNvcnRDb2x1bW4gPT09IGlkQ29sdW1uIHx8IHJhd0N1cnNvci5zb3J0VGV4dCA9PT0gbnVsbCB8fCBpc0Nhc3RhYmxlVG8oc29ydENvbHVtbiwgcmF3Q3Vyc29yLnNvcnRUZXh0KSlcbiAgICAgID8gcmF3Q3Vyc29yXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGN1cnNvciAmJiAhZGVjb2RlZEN1cnNvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIG1hbGZvcm1lZCBwYWdpbmF0aW9uIGN1cnNvcicsIHsgZW50aXR5OiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICBpZiAoZGVjb2RlZEN1cnNvcikge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGtleXNldEFmdGVyKHNvcnRDb2x1bW4sIGlkQ29sdW1uLCBzb3J0T3JkZXIsIGRlY29kZWRDdXJzb3Iuc29ydFRleHQsIGRlY29kZWRDdXJzb3IuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBXcmFwIHRoZSB3aG9sZSBwYWdpbmF0ZWQgcmVhZCAoU0VMRUNUICsgb3B0aW9uYWwgQ09VTlQpIGluIG9uZVxuICAgIC8vIHRlbmFudCB0eC4gQm90aCBxdWVyaWVzIGFyZSB2aXNpYmlsaXR5LXNjb3BlZCBieSB0aGUgc2FtZSBSTFMgcG9saWN5LFxuICAgIC8vIGFuZCBwaW5uaW5nIHRoZW0gdG8gYSBzaW5nbGUgdHgga2VlcHMgdGhlIGBhcHAub3JnX2lkYCBHVUMgc3RhYmxlXG4gICAgLy8gYmV0d2VlbiB0aGVtLiBXaGVuIHdpZGVuaW5nIHRvIGEgcGFyZW50IG9yZywgdGhlIHdob2xlIHJlYWQgcnVucyB1bmRlclxuICAgIC8vIHN5c2FkbWluIGNvbnRleHQgKHNlZSBydW5SZWFkKSBzbyB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgaXMgdGhlIGdhdGUuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gUHJvamVjdGlvbjogdGhlIHNwYXJzZSBmaWVsZHNldCAoYWx3YXlzIGluY2x1ZGVzIGBpZGApIG9yIGV2ZXJ5IGNvbHVtbixcbiAgICAgIC8vIHBsdXMgdGhlIHNvcnQgY29sdW1uJ3MgZXhhY3QgdGV4dCBmb3IgdGhlIG5leHQgY3Vyc29yLlxuICAgICAgY29uc3QgYmFzZVNlbGVjdCA9IChmaWVsZHMgPyB0aGlzLmJ1aWxkRmllbGRTZWxlY3QoZmllbGRzKSA6IHVuZGVmaW5lZCkgPz8gZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKTtcbiAgICAgIGNvbnN0IHNlbGVjdFNwZWMgPSB7IC4uLmJhc2VTZWxlY3QsIFtDVVJTT1JfU09SVF9LRVldOiBzcWw8c3RyaW5nIHwgbnVsbD5gJHtzb3J0Q29sdW1ufTo6dGV4dGAgfTtcblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSBkZWNvZGVkQ3Vyc29yID8gMCA6IG9mZnNldDtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgLm9yZGVyQnkoLi4ub3JkZXJCeSlcbiAgICAgICAgLmxpbWl0KGxpbWl0ICsgMSlcbiAgICAgICAgLm9mZnNldChlZmZlY3RpdmVPZmZzZXQpLnRoZW4ociA9PiBkcml6emxlUm93czxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IHBhZ2UgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuICAgICAgY29uc3QgZGF0YSA9IHBhZ2UubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0geyAuLi5yb3cgfTtcbiAgICAgICAgZGVsZXRlIGVudGl0eVtDVVJTT1JfU09SVF9LRVldO1xuICAgICAgICByZXR1cm4gZW50aXR5IGFzIFRFbnRpdHk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4gPSB7IGRhdGEsIGxpbWl0LCBvZmZzZXQ6IGVmZmVjdGl2ZU9mZnNldCwgaGFzTW9yZSB9O1xuXG4gICAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gcGFnZVtwYWdlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBzb3J0VGV4dCA9IGxhc3RbQ1VSU09SX1NPUlRfS0VZXTtcbiAgICAgICAgcmVzdWx0Lm5leHRDdXJzb3IgPSBlbmNvZGVDdXJzb3Ioc29ydFRleHQgPT0gbnVsbCA/IG51bGwgOiBTdHJpbmcoc29ydFRleHQpLCBTdHJpbmcobGFzdC5pZCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgQ09VTlQoKikgcXVlcnkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgbmVlZHMgdGhlIHRvdGFsLlxuICAgICAgLy8gTXVzdCBpbmNsdWRlIHBhcmVudE9yZ0lkIHNvIGB0b3RhbGAgbWF0Y2hlcyB0aGUgd2lkZW5lZCBkYXRhIHNldC5cbiAgICAgIGlmIChpbmNsdWRlVG90YWwpIHtcbiAgICAgICAgY29uc3QgYmFzZUNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgICAgIGNvbnN0IFtjb3VudFJlc3VsdF0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAud2hlcmUoYW5kKC4uLmJhc2VDb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSk7XG4gICAgICAgIHJlc3VsdC50b3RhbCA9IGNvdW50UmVzdWx0Py5jb3VudCB8fCAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbHVtbiBzZWxlY3Rpb24gbWFwIGZvciBzcGFyc2UgZmllbGRzZXRzLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgc2VsZWN0IGlmIG5vIGZpZWxkcyBhcmUgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBgaWRgIGlzIGFsd2F5cyBpbmNsdWRlZCDigJQgaXQgaXMgdGhlIGVudGl0eSBpZGVudGl0eSBBTkQgdGhlIGtleXNldCBjdXJzb3Inc1xuICAgKiB0aWUtYnJlYWtlci4gVGhlIHNvcnQgdmFsdWUgZm9yIHRoZSBjdXJzb3IgaXMgcHJvamVjdGVkIHNlcGFyYXRlbHkgKGFzIHRleHQpXG4gICAqIGJ5IGBmaW5kUGFnaW5hdGVkYCwgc28gdGhlIGZpZWxkc2V0IG5lZWQgbm90IGNhcnJ5IHRoZSBzb3J0IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGaWVsZFNlbGVjdChmaWVsZHM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAvLyBBbHdheXMgaW5jbHVkZSBpZCBmb3IgZW50aXR5IGlkZW50aXR5XG4gICAgY29sdW1ucy5pZCA9IHRoaXMuY29scy5pZDtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQgPT09ICdpZCcpIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGluY2x1ZGVkXG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHNbZmllbGRdO1xuICAgICAgaWYgKGNvbCkgY29sdW1uc1tmaWVsZF0gPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gQXQgbWluaW11bSB3ZSdsbCBoYXZlIHsgaWQgfSwgd2hpY2ggaXMgdmFsaWRcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHRoZSBjb3VudCB0byB0aGUgcGFyZW50IG9yZydzXG4gICAqICAgcHVibGljIHJvd3MuIE1VU1QgbWlycm9yIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAncyB3aWRlbmluZyAoc2FtZVxuICAgKiAgIGBidWlsZENvbmRpdGlvbnNgIGFyZ3MgKyBzeXNhZG1pbi1zY29wZWQgcmVhZCB2aWEgYHJ1blJlYWRgKSBzbyBhIHBhZ2VkXG4gICAqICAgbGlzdCdzIGB0b3RhbGAgbWF0Y2hlcyB0aGUgcm93cyBhIHdpZGVuZWQgYGZpbmQoKWAgcmV0dXJucyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgKiAgIGNvdW50IG9taXRzIHRoZSBwYXJlbnQncyByb3dzIGFuZCByZXBvcnRzIGEgbmFycm93ZXIgdG90YWwgdGhhbiB0aGUgZGF0YSBzZXQuXG4gICAqL1xuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8uY291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2luZ2xlIGVudGl0eSBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBFbnRpdHkgSURcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB2aXNpYmlsaXR5IHRvIHRoZSBwYXJlbnRcbiAgICogICBvcmcncyBwdWJsaWMgcm93cyAoc28gYSB0ZWFtIGNhbiBmZXRjaCBhIHBhcmVudCdzIHB1YmxpYyBlbnRpdHkgYnkgaWQpLlxuICAgKiAgIFNhbWUgb3B0LWluICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYDsgdGhlXG4gICAqICAgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgLy8gRXhhY3QgaWQg4oCUIGBmaW5kQnlJZGAgbWVhbnMgVEhFIHJvdyB3aXRoIHRoaXMgaWQsIG5vdCBhIHByZWZpeCBtYXRjaC4gVGhlXG4gICAgLy8gc2hhcmVkIGBidWlsZElkRmlsdGVyYCBwcmVmaXgtbWF0Y2hlcyBub24tZnVsbC1VVUlEIHZhbHVlcyAoYSBsaXN0LXNlYXJjaFxuICAgIC8vIGZlYXR1cmUpLCB3aGljaCBoZXJlIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkgZmlyc3QgcHJlZml4IGhpdCBmb3IgYVxuICAgIC8vIHBhcnRpYWwgaWQ7IHBpbiBpdCB0byBleGFjdCBzbyBhIG1hbGZvcm1lZCBpZCByZXR1cm5zIG51bGwuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvLyBNdXRhdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIERlZmVuc2UtaW4tZGVwdGggdGVuYW50IHN0YW1wLiBSTFMgaXMgaW4gb3duZXItYnlwYXNzIG1vZGUsIHNvIHRoZSBhcHAgbGF5ZXJcbiAgICogaXMgdGhlIG9ubHkgdGVuYW50IGdhdGUgb24gd3JpdGVzLiBBIE5PTi1zeXNhZG1pbiBjYWxsZXIgbWF5IG9ubHkgd3JpdGUgaW50b1xuICAgKiBpdHMgT1dOIG9yZywgc28gcGluIHRoZSByb3cgdG8gdGhlIHRydXN0ZWQgdGVuYW50LWNvbnRleHQgb3JnLlxuICAgKlxuICAgKiBUaGUgc3RhbXAgZmlyZXMgd2hlbmV2ZXIgdGhlIHBheWxvYWQncyBgb3JnSWRgIGRpZmZlcnMgZnJvbSB0aGUgY29udGV4dCBvcmcg4oCUXG4gICAqIHdoaWNoIGNvdmVycyBCT1RIIGEgZm9yZ2VkL21pc21hdGNoZWQgYGRhdGEub3JnSWRgIEFORCBhbiBBQlNFTlQgb25lLiBUaGVcbiAgICogYWJzZW50IGNhc2UgaXMgdGhlIGltcG9ydGFudCB0ZW5hbnQtYm91bmRhcnkgZml4OiB0aGUgYG9yZ19pZGAgY29sdW1uIERFRkFVTFRzXG4gICAqIHRvIGBTWVNURU1fT1JHX0lEYCAoc2NoZW1hL3BpcGVsaW5lLnRzLCBzY2hlbWEvcGx1Z2luLnRzKSwgc28gYW4gaW5zZXJ0IHRoYXRcbiAgICogb21pdHMgYG9yZ0lkYCB3b3VsZCBvdGhlcndpc2UgbGFuZCB0aGUgdGVuYW50J3Mgcm93IGluIHRoZSBwdWJsaWMgc3lzdGVtXG4gICAqIGNhdGFsb2cg4oCUIGEgY3Jvc3MtdGVuYW50IGZhaWwtb3Blbi4gQWx3YXlzIGluamVjdGluZyBgY3R4Lm9yZ0lkYCBjbG9zZXMgaXQuXG4gICAqXG4gICAqIFN5c2FkbWluIChhbmQgb3V0LW9mLWNvbnRleHQgd29ya2VyL3N5c3RlbSBwYXRocywgd2hlcmUgYGdldFRlbmFudENvbnRleHQoKWBcbiAgICogaXMgdW5kZWZpbmVkKSBrZWVwIHRoZSBzdXBwbGllZCBvcmcsIG1hdGNoaW5nIHRoZSBSTFMgcG9saWN5XG4gICAqIGBjdXJyZW50X2lzX3N5c2FkbWluKCkgT1Igb3JnX2lkID0gY3VycmVudF9vcmdfaWQoKWAuXG4gICAqL1xuICAvLyBHZW5lcmljIG92ZXIgdGhlIHBheWxvYWQgc2hhcGUgc28gQk9USCB0aGUgY3JlYXRlIChgVEluc2VydGApIGFuZCB1cGRhdGVcbiAgLy8gKGBQYXJ0aWFsPFRVcGRhdGU+YCkgY2FsbCBzaXRlcyB1c2UgaXQgd2l0aG91dCB0aGUgYGFzIHVua25vd24gYXMgVEluc2VydGBcbiAgLy8gcm91bmQtdHJpcCB0aGV5IHByZXZpb3VzbHkgbmVlZGVkIOKAlCB0aGUgb3JnLXN0YW1wIGxvZ2ljIGlzIGlkZW50aWNhbCBmb3JcbiAgLy8gZWl0aGVyIHNoYXBlIChpdCBvbmx5IHRvdWNoZXMgdGhlIGBvcmdJZGAga2V5KS5cbiAgcHJvdGVjdGVkIGVuZm9yY2VPcmdJZDxUPihkYXRhOiBULCBpc0NyZWF0ZSA9IGZhbHNlKTogVCB7XG4gICAgY29uc3QgY3R4ID0gZ2V0VGVuYW50Q29udGV4dCgpO1xuICAgIGNvbnN0IGQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8vIFJlZnVzZSBhIGNvbnRleHQtbGVzcywgb3JnSWQtbGVzcyBJTlNFUlQgb24gYW4gb3JnLXNjb3BlZCBlbnRpdHk6IHRoZSBgb3JnSWRgXG4gICAgLy8gY29sdW1uIGRlZmF1bHRzIHRvIFNZU1RFTV9PUkdfSUQsIHNvIHN1Y2ggYSByb3cgd291bGQgc2lsZW50bHkgbGFuZCBpbiB0aGVcbiAgICAvLyBwdWJsaWMgY3Jvc3Mtb3JnIGNhdGFsb2cuIEEgYmFja2dyb3VuZCBqb2IgdGhhdCBmb3Jnb3QgYHJ1bldpdGhUZW5hbnRDb250ZXh0YFxuICAgIC8vIChhbmQgZGlkbid0IHBhc3MgYW4gZXhwbGljaXQgb3JnSWQpIG11c3QgZmFpbCBsb3VkbHksIG5vdCBsZWFrIGludG8gYHN5c3RlbWAuXG4gICAgLy8gKFN5c2FkbWluL3NlZWQgd3JpdGVzIGNhcnJ5IGEgY29udGV4dCBvciBhbiBleHBsaWNpdCBvcmdJZCwgc28gdGhleSBwYXNzLilcbiAgICBpZiAoaXNDcmVhdGUgJiYgIWN0eCAmJiBkLm9yZ0lkID09IG51bGwgJiYgdGhpcy5jb2xzLm9yZ0lkICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmNyZWF0ZSByZXF1aXJlcyBhbiBvcmdJZCAobm8gdGVuYW50IGNvbnRleHQgYW5kIG5vbmUgc3VwcGxpZWQpIOKAlCByZWZ1c2luZyB0byBkZWZhdWx0IHRvIHRoZSBzeXN0ZW0gb3JnYCk7XG4gICAgfVxuICAgIGlmIChjdHggJiYgIWN0eC5pc1N1cGVyQWRtaW4gJiYgY3R4Lm9yZ0lkICYmIGQub3JnSWQgIT09IGN0eC5vcmdJZCkge1xuICAgICAgLy8gRGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyB0aGF0IHJlYWNoIGhlcmUgc28gdGhlIGxvZyBzdGF5cyB1c2VmdWwgYW5kXG4gICAgICAvLyBxdWlldDogYSBQUkVTRU5ULWJ1dC1taXNtYXRjaGVkIGBvcmdJZGAgaXMgYW4gYWN0dWFsIG92ZXJyaWRlIGF0dGVtcHRcbiAgICAgIC8vICh3YXJuKSwgd2hpbGUgYW4gQUJTRU5UIGBvcmdJZGAgaXMgdGhlIGNvbW1vbiBub3JtYWwtd3JpdGUgcGF0aCB0aGF0IGp1c3RcbiAgICAgIC8vIG5lZWRzIHRoZSBkZWZhdWx0IHN0YW1wIChkZWJ1Zykg4oCUIGxvZ2dpbmcgdGhhdCBhdCB3YXJuIGZsb29kcyB0aGUgbG9nIG9uXG4gICAgICAvLyBldmVyeSB3cml0ZSB0aGF0IG9taXRzIG9yZ0lkLlxuICAgICAgY29uc3QgbWV0YSA9IHsgc3VwcGxpZWQ6ICdvcmdJZCcgaW4gZCA/IGQub3JnSWQgOiB1bmRlZmluZWQsIGVuZm9yY2VkOiBjdHgub3JnSWQgfTtcbiAgICAgIGlmICgnb3JnSWQnIGluIGQpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0NydWRTZXJ2aWNlOiBvdmVycmlkaW5nIG1pc21hdGNoZWQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ0NydWRTZXJ2aWNlOiBzdGFtcGluZyB0ZW5hbnQtY29udGV4dCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmQsIG9yZ0lkOiBjdHgub3JnSWQgfSBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5XG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogVEluc2VydCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEsIC8qIGlzQ3JlYXRlICovIHRydWUpO1xuICAgIC8vIENyZWF0ZSBuZXZlciBvdmVyd3JpdGVzLiBUaGUgY29uZmxpY3Qga2V5IGNhbiBtYXRjaCBhIExJVkUgcm93IChhbm90aGVyXG4gICAgLy8gYXV0aG9yJ3MsIG9yIG9uZSB0aGUgY2FsbGVyIGNvdWxkbid0IGVkaXQgdGhyb3VnaCB1cGRhdGUpIG9yIGEgc29mdC1kZWxldGVkXG4gICAgLy8gVE9NQlNUT05FOyByZXBsYWNpbmcgZWl0aGVyIHdvdWxkIGJ5cGFzcyB1cGRhdGUncyBhY2Nlc3MgY2hlY2tzIG9yIHJlc3RvcmUnc1xuICAgIC8vIHN0ZXAtdXAuIE9uIGFueSBjb25mbGljdCBub3RoaW5nIGlzIHdyaXR0ZW4gYW5kIHRoZSBjYWxsZXIgZ2V0cyBhIDQwOS5cbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXMoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnkgfSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoJ0EgcmVjb3JkIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgYWxyZWFkeSBleGlzdHMuIElmIGl0IHdhcyBkZWxldGVkLCByZXN0b3JlIGl0IGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICAgIGRlbGV0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cblxuICAvKipcbiAgICogVGhlIGB2aXNpYmlsaXR5YCBwcmVkaWNhdGUgZm9yIGEgYnVsayBzb2Z0LWRlbGV0ZSwgbWlycm9yaW5nXG4gICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBydW5nIGZvciBydW5nIHNvIGJ1bGsgYW5kIHNpbmdsZS1yb3cgZGVsZXRlXG4gICAqIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY2FsbGVyIG1heSByZW1vdmUuXG4gICAqXG4gICAqIFJldHVybnMgbm8gY29uZGl0aW9uIGF0IGFsbCBmb3IgYSBzeXN0ZW0gYWRtaW4sIG9yIGZvciBhbiBlbnRpdHkgd2l0aCBub1xuICAgKiBgdmlzaWJpbGl0eWAgY29sdW1uIChub3RoaW5nIHRvIGdhdGUgb24pLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpYmlsaXR5RGVsZXRlQ29uZGl0aW9ucyhcbiAgICBhY2Nlc3M6IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGFjY2Vzc0NvbD86IEFueUNvbHVtbixcbiAgICBjcmVhdGVkQnlDb2w/OiBBbnlDb2x1bW4sXG4gICk6IFNRTFtdIHtcbiAgICBpZiAoIWFjY2Vzc0NvbCkgcmV0dXJuIFtdO1xuICAgIGlmICghYWNjZXNzIHx8IGFjY2Vzcy5pc1N5c3RlbUFkbWluKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBydW5nczogU1FMW10gPSBbZXEoYWNjZXNzQ29sLCAnb3JnJyldO1xuICAgIC8vIGBwcml2YXRlYCBpcyBhdXRob3Itb25seS4gV2l0aCBubyBhdXRob3IgY29sdW1uIG9yIG5vIGNhbGxlciBpZGVudGl0eSB3ZVxuICAgIC8vIGNhbm5vdCBwcm92ZSBhdXRob3JzaGlwLCBzbyB0aGUgcnVuZyBpcyBzaW1wbHkgbm90IG9mZmVyZWQgKGZhaWwgY2xvc2VkKVxuICAgIC8vIHJhdGhlciB0aGFuIG1hdGNoaW5nIGV2ZXJ5IHByaXZhdGUgcm93LlxuICAgIGlmIChjcmVhdGVkQnlDb2wgJiYgdXNlcklkKSB7XG4gICAgICBydW5ncy5wdXNoKGFuZChlcShhY2Nlc3NDb2wsICdwcml2YXRlJyksIGVxKGNyZWF0ZWRCeUNvbCwgdXNlcklkKSkgYXMgU1FMKTtcbiAgICB9XG4gICAgaWYgKGFjY2Vzcy5jYW5QdWJsaXNoKSBydW5ncy5wdXNoKGVxKGFjY2Vzc0NvbCwgJ3B1YmxpYycpKTtcblxuICAgIHJldHVybiBbb3IoLi4ucnVuZ3MpIGFzIFNRTF07XG4gIH1cblxuICAvKipcbiAgICogU29mdC1kZWxldGUgbXVsdGlwbGUgZW50aXRpZXMgYnkgSURzIGluIGEgc2luZ2xlIGJhdGNoIG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGJ1bGtEZWxldGUoXG4gICAgaWRzOiBzdHJpbmdbXSxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSBjYWxsZXIncyBhdXRob3JpdHkgb24gdGhlIHRocmVlLXJ1bmcgYHZpc2liaWxpdHlgIGxhZGRlci4gT21pdCAob3JcbiAgICAgKiBwYXNzIGBpc1N5c3RlbUFkbWluOiB0cnVlYCkgZm9yIGFuIHVucmVzdHJpY3RlZCBkZWxldGUuXG4gICAgICpcbiAgICAgKiBUaGlzIHVzZWQgdG8gYmUgYSBgcmVzdHJpY3RUb1ByaXZhdGVgIGJvb2xlYW4gdGhhdCBuYXJyb3dlZCB0b1xuICAgICAqIGB2aXNpYmlsaXR5ID0gJ3ByaXZhdGUnYC4gVGhhdCBlbmNvZGVkIHRoZSBPTEQgdHdvLXN0YXRlIG1vZGVsOiBzaW5jZVxuICAgICAqIGByZXNvbHZlVmlzaWJpbGl0eWAgZGVmYXVsdHMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvIGBvcmdgLCBhbmRcbiAgICAgKiBzaW5nbGUtcm93IGRlbGV0ZSBhbGxvd3MgYW4gYG9yZ2Agcm93IHdpdGggcGxhaW4gYDp3cml0ZWAsIGJ1bGsgZGVsZXRlXG4gICAgICogNDAzJ2QgdGhlIG5vcm1hbCBjYXNlIOKAlCBhbiBvcmcgYWRtaW4gY291bGQgZGVsZXRlIGEgcGlwZWxpbmUgb25lIGF0IGFcbiAgICAgKiB0aW1lIGJ1dCBub3QgaW4gYnVsay4gVGhlIHJ1bmdzIGVuZm9yY2VkIGhlcmUgbWlycm9yXG4gICAgICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3NgIGV4YWN0bHk6XG4gICAgICogICAtIGBwcml2YXRlYCDihpIgYXV0aG9yIG9ubHkgKGBjcmVhdGVkQnkgPT09IHVzZXJJZGApXG4gICAgICogICAtIGBvcmdgICAgICDihpIgYW55IG1lbWJlciBvZiB0aGUgb3JnIChwbGFpbiBgOndyaXRlYClcbiAgICAgKiAgIC0gYHB1YmxpY2AgIOKGkiByZXF1aXJlcyB0aGUgZW50aXR5J3MgcHVibGlzaCBwZXJtaXNzaW9uXG4gICAgICovXG4gICAgYWNjZXNzPzogeyBpc1N5c3RlbUFkbWluOiBib29sZWFuOyBjYW5QdWJsaXNoOiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICAvLyBPd25lci1zY29wZSB0aGUgYnVsayBzb2Z0LWRlbGV0ZTogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXJcbiAgICAvLyAtb3JnIFBVQkxJQyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgdGVuYW50IGNvdWxkIGRlbGV0ZVxuICAgIC8vIHNoYXJlZCByZWNvcmRzIGJ5IGlkLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pXG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgY29uc3QgY3JlYXRlZEJ5Q29sID0gdGhpcy5jb2xzLmNyZWF0ZWRCeTtcbiAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgaW5BcnJheSh0aGlzLmNvbHMuaWQsIGlkcyksXG4gICAgICAuLi50aGlzLmJ1aWxkQ29uZGl0aW9ucyh7fSBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCksXG4gICAgICAvLyBUZW5hbnQgY29sdW1uIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsKSDigJQgY29uc2lzdGVudCB3aXRoXG4gICAgICAvLyB3cml0ZUNvbmRpdGlvbnM7IG5vIHNpbGVudCBmYWlsLW9wZW4gd2hlbiB0aGUgcHJvcGVydHkgaXMgYWJzZW50LlxuICAgICAgLi4uKG9yZ0lkID8gW2VxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKV0gOiBbXSksXG4gICAgICAuLi50aGlzLnZpc2liaWxpdHlEZWxldGVDb25kaXRpb25zKGFjY2VzcywgdXNlcklkLCBhY2Nlc3NDb2wsIGNyZWF0ZWRCeUNvbCksXG4gICAgXTtcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXIsXG4gICAgICAgIGRlbGV0ZWRBdDogbm93LFxuICAgICAgICBkZWxldGVkQnk6IHVzZXIsXG4gICAgICAgIC8vIFN0YW1wIHRoZSBwdXJnZSBkZWFkbGluZSBzbyB0aGUgcmV0ZW50aW9uIHN3ZWVwIGNhbiBoYXJkLWRlbGV0ZSBsYXRlci5cbiAgICAgICAgLi4udGhpcy5wdXJnZUFmdGVyU3RhbXAobm93KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZGVsZXRlZC5tYXAoZW50aXR5ID0+XG4gICAgICAgIHRoaXMub25BZnRlckRlbGV0ZShlbnRpdHkuaWQsIGVudGl0eSwgdXNlcklkKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc29mdC1kZWxldGVkICh0b21ic3RvbmVkKSBlbnRpdHk6IGNsZWFyIGBpc0FjdGl2ZWAvYGRlbGV0ZWRBdGAvXG4gICAqIGBkZWxldGVkQnlgL2BwdXJnZUFmdGVyYCBzbyBpdCByZWFwcGVhcnMgaW4gbm9ybWFsIHJlYWRzLlxuICAgKlxuICAgKiBNYXRjaGVzIE9OTFkgYSBnZW51aW5lIHRvbWJzdG9uZSDigJQgYGlzQWN0aXZlID0gZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCDigJQgc28gYSBtZXJlbHkgKmRlYWN0aXZhdGVkKiByb3cgKGlzQWN0aXZlPWZhbHNlLCBubyBkZWxldGVkQXQpIGlzIG5ldmVyXG4gICAqIHNpbGVudGx5IFwicmVzdG9yZWRcIi4gUGlubmVkIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIChvcmdJZC1sZXNzIHN5c2FkbWluXG4gICAqIGNvbnRleHQgc3BhbnMgb3JncywgbWF0Y2hpbmcgZGVsZXRlL3VwZGF0ZSkuIFJldHVybnMgbnVsbCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIHN1Y2ggdG9tYnN0b25lIChhbHJlYWR5IGFjdGl2ZSwgcHVyZ2VkLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICogQSB1bmlxdWUta2V5IGNvbGxpc2lvbiAoYSBsaXZlIHJvdyBhbHJlYWR5IGhvbGRzIHRoZSBrZXkpIHN1cmZhY2VzIGFzIHRoZVxuICAgKiBkcml2ZXIncyB1bmlxdWUtdmlvbGF0aW9uIGZvciB0aGUgcm91dGUgdG8gbWFwIHRvIDQwOSDigJQgaW4gcHJhY3RpY2UgdGhlXG4gICAqIHRvbWJzdG9uZSBJUyB0aGUga2V5IGhvbGRlciwgc28gdGhpcyBpcyBkZWZlbnNpdmUuXG4gICAqL1xuICAvKiogQ29uZGl0aW9ucyBtYXRjaGluZyBhIEdFTlVJTkUgdG9tYnN0b25lIChgaXNBY3RpdmU9ZmFsc2VgIEFORCBgZGVsZXRlZEF0IElTXG4gICAqICBOT1QgTlVMTGApLCBvcHRpb25hbGx5IHBpbm5lZCB0byBgaWRgIGFuZC9vciBgb3JnSWRgLiBTaW5nbGUgc291cmNlIG9mIHRydXRoXG4gICAqICBmb3IgcmVzdG9yZS9maW5kRGVsZXRlZEJ5SWQvZmluZERlbGV0ZWQgc28gdGhlIFwid2hhdCBpcyBhIHRvbWJzdG9uZVwiIHJ1bGVcbiAgICogIGxpdmVzIGluIG9uZSBwbGFjZS4gKi9cbiAgcHJpdmF0ZSB0b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkPzogc3RyaW5nLCBpZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtcbiAgICAgIGVxKHRoaXMuY29scy5pc0FjdGl2ZSwgZmFsc2UpLFxuICAgICAgc3FsYCR7dGhpcy5jb2xzLmRlbGV0ZWRBdH0gSVMgTk9UIE5VTExgLFxuICAgIF07XG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMudW5zaGlmdCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICBpZiAob3JnSWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCkpO1xuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgYXN5bmMgcmVzdG9yZShpZDogc3RyaW5nLCBvcmdJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsOyAvLyBlbnRpdHkgaGFzIG5vIHNvZnQtZGVsZXRlIGxpZmVjeWNsZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IFtyZXN0b3JlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBudWxsLFxuICAgICAgICBkZWxldGVkQnk6IG51bGwsXG4gICAgICAgIC4uLih0aGlzLmNvbHMucHVyZ2VBZnRlciA/IHsgcHVyZ2VBZnRlcjogbnVsbCB9IDoge30pLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHJlc3RvcmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJSZXN0b3JlKGlkLCByZXN0b3JlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3RvcmVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHNvZnQtZGVsZXRlZCBlbnRpdHkgYnkgaWQgKHRoZSBpbnZlcnNlIG9mIHRoZSBkZWZhdWx0IGBpc0FjdGl2ZT10cnVlYFxuICAgKiByZWFkcykg4oCUIHVzZWQgYnkgcmVzdG9yZSByb3V0ZXMgdG8gbG9hZCB0aGUgdG9tYnN0b25lIGZvciBhY2Nlc3MtY29udHJvbFxuICAgKiBnYXRpbmcgYmVmb3JlIHJlc3RvcmluZy4gUmV0dXJucyBudWxsIHVubGVzcyB0aGUgcm93IGV4aXN0cyBBTkQgaXMgYSBnZW51aW5lXG4gICAqIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKS5cbiAgICovXG4gIGFzeW5jIGZpbmREZWxldGVkQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYW4gb3JnJ3Mgc29mdC1kZWxldGVkIHRvbWJzdG9uZXMgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVFxuICAgKiBOVUxMYCksIG1vc3QtcmVjZW50bHktZGVsZXRlZCBmaXJzdCDigJQgcG93ZXJzIHRoZSBcInJlY2VudGx5IGRlbGV0ZWRcIiByZXN0b3JlXG4gICAqIFVJLiBSZXR1cm5zIGBbXWAgZm9yIGVudGl0aWVzIHdpdGhvdXQgYSBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGUuIGBsaW1pdGAgaXNcbiAgICogY2xhbXBlZCB0byBbMSwgMjAwXSB0byBrZWVwIHRoZSByZXNwb25zZSBib3VuZGVkICh0aGUgcmV0ZW50aW9uIHN3ZWVwIGhhcmQtXG4gICAqIGRlbGV0ZXMgb2xkIHRvbWJzdG9uZXMgYW55d2F5LCBzbyB0aGlzIGlzIGEgc2hvcnQsIHNlbGYtbGltaXRpbmcgbGlzdCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIG9wdHM6IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gW107XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCBvcHRzLmxpbWl0ID8/IDUwKSwgMjAwKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCA/PyAwKTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5vcmRlckJ5KGRlc2ModGhpcy5jb2xzLmRlbGV0ZWRBdCEpKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICAgICAgLm9mZnNldChvZmZzZXQpXG4gICAgICAudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZC1kZWxldGUgYSBiYXRjaCBvZiB0b21ic3RvbmVzIHdob3NlIHB1cmdlIGRlYWRsaW5lIGhhcyBwYXNzZWRcbiAgICogKGBkZWxldGVkQXQgSVMgTk9UIE5VTEwgQU5EIHB1cmdlX2FmdGVyIDwgbm93YCkuIEJhdGNoZWQgKGBsaW1pdGApIHNvIGFcbiAgICogc3dlZXAgdGljayBzdGF5cyBib3VuZGVkOyB0aGUgcGVyLXNlcnZpY2Ugc3dlZXAgbG9vcHMgdW50aWwgYSB0aWNrIHJldHVybnNcbiAgICogYDwgbGltaXRgLiBSdW5zIGFjcm9zcyBBTEwgb3Jncywgc28gY2FsbGVycyBNVVNUIGludm9rZSBpdCBmcm9tIGEgc3lzYWRtaW5cbiAgICogc2NvcGUgKGBydW5Tb2Z0RGVsZXRlUHVyZ2VgIGVzdGFibGlzaGVzIG9uZSkuIGBvbkJlZm9yZVB1cmdlKGlkcywgdHgpYCB0ZWFyc1xuICAgKiBkb3duIGRlcGVuZGVudHMgbGFja2luZyBPTiBERUxFVEUgQ0FTQ0FERSBpbnNpZGUgdGhlIHNhbWUgdHg7IGBvbkFmdGVyUHVyZ2VgXG4gICAqIGhhbmRsZXMgZXh0ZXJuYWwgc2lkZS1lZmZlY3RzLlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBwdXJnZWQuIE5vLW9wICgwKSBmb3IgZW50aXRpZXMgd2l0aG91dCB0aGUgY29sdW1ucy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZChub3c6IERhdGUsIGxpbWl0ID0gNTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQgfHwgIXRoaXMuY29scy5wdXJnZUFmdGVyKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHB1cmdlZElkcyA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIGNvbnN0IGRvb21lZCA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiB0aGUgYC5zZXQoKWBcbiAgICAgICAgLy8gY2FzdHMgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSB3b3JrIGFyb3VuZCkuIFJlc3VsdCBpcyByZS10eXBlZCBiZWxvdy5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCwgc3FsYCR7dGhpcy5jb2xzLnB1cmdlQWZ0ZXJ9IDwgJHtub3d9YCkpXG4gICAgICAgIC5saW1pdChsaW1pdClcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKGRvb21lZC5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgICAgLy8gRGVwZW5kZW50IHRlYXJkb3duIG11c3QgaGFwcGVuIGluc2lkZSB0aGUgc2FtZSB0eCBzbyBhIEZLLWJsb2NraW5nIGNoaWxkXG4gICAgICAvLyBjYW4ndCBzdHJhbmQgdGhlIHBhcmVudC4gQSB0aHJvdyBoZXJlIGFib3J0cyB0aGlzIGJhdGNoIChyZXRyaWVkIG5leHQgdGljaykuXG4gICAgICBhd2FpdCB0aGlzLm9uQmVmb3JlUHVyZ2UoZG9vbWVkLCB0eCk7XG5cbiAgICAgIGF3YWl0IHR4LmRlbGV0ZSh0aGlzLnNjaGVtYSkud2hlcmUoaW5BcnJheSh0aGlzLmNvbHMuaWQsIGRvb21lZCkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UocHVyZ2VkSWRzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1cmdlZElkcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogT24tZGVtYW5kIGhhcmQtZGVsZXRlIG9mIGEgU0lOR0xFIHRvbWJzdG9uZSBieSBpZCDigJQgdGhlIG1hbnVhbCBjb3VudGVycGFydFxuICAgKiB0byB0aGUgcmV0ZW50aW9uIHN3ZWVwJ3MgYHB1cmdlRXhwaXJlZGAuIFBlcm1hbmVudGx5IHJlbW92ZXMgdGhlIHJvdyBPTkxZXG4gICAqIHdoZW4gaXQgaXMgYSBnZW51aW5lIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCArIGBkZWxldGVkQXQgSVMgTk9UIE5VTExgKSxcbiAgICogb3B0aW9uYWxseSBwaW5uZWQgdG8gYG9yZ0lkYCAoYW4gb3JnSWQtbGVzcyBzeXNhZG1pbiBjb250ZXh0IHNwYW5zIG9yZ3MsXG4gICAqIG1hdGNoaW5nIHJlc3RvcmUvZGVsZXRlKS4gUnVucyB0aGUgc2FtZSBgb25CZWZvcmVQdXJnZWAgZGVwZW5kZW50IHRlYXJkb3duXG4gICAqIGluc2lkZSB0aGUgdHggYW5kIHRoZSBzYW1lIGBvbkFmdGVyUHVyZ2VgIHNpZGUtZWZmZWN0cyBhcyB0aGUgc3dlZXAuXG4gICAqXG4gICAqIElnbm9yZXMgYHB1cmdlQWZ0ZXJgOiBhIG1hbnVhbCBwdXJnZSBmaW5hbGl6ZXMgYW4gYWxyZWFkeS1zb2Z0LWRlbGV0ZWQgaXRlbVxuICAgKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcmV0ZW50aW9uIGRlYWRsaW5lLiBSZXR1cm5zIHRoZVxuICAgKiBwdXJnZWQgaWQsIG9yIG51bGwgd2hlbiB0aGVyZSBpcyBubyBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCxcbiAgICogb3V0IG9mIHNjb3BlLCBvciB1bmtub3duKSBzbyB0aGUgcm91dGUgY2FuIDQwNC5cbiAgICovXG4gIGFzeW5jIHB1cmdlQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZCwgaWQpO1xuXG4gICAgY29uc3QgcHVyZ2VkSWQgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBbZG9vbWVkXSA9IGF3YWl0IHR4XG4gICAgICAgIC8vIGBhcyBhbnlgOiBjb2xzLmlkIGlzIHRoZSBiYXNlIGBBbnlDb2x1bW5gLCB3aGljaCBkcml6emxlJ3MgdHlwZWRcbiAgICAgICAgLy8gc2VsZWN0LWZpZWxkIG1hcCBkb2Vzbid0IGFjY2VwdCBkaXJlY3RseSAoc2FtZSBmcmljdGlvbiBlbHNld2hlcmUpLlxuICAgICAgICAuc2VsZWN0KHsgaWQ6IHRoaXMuY29scy5pZCBhcyBhbnkgfSlcbiAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAudGhlbihyID0+IChyIGFzIEFycmF5PHsgaWQ6IHVua25vd24gfT4pLm1hcChkID0+IFN0cmluZyhkLmlkKSkpO1xuXG4gICAgICBpZiAoIWRvb21lZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBpbiB0aGUgc2FtZSB0eCAoRkstYmxvY2tpbmcgY2hpbGRyZW4gY2FuJ3Qgc3RyYW5kXG4gICAgICAvLyB0aGUgcGFyZW50KSDigJQgaWRlbnRpY2FsIHRvIHRoZSBzd2VlcCdzIHBlci1iYXRjaCBwYXRoLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKFtkb29tZWRdLCB0eCk7XG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBbZG9vbWVkXSkpO1xuICAgICAgcmV0dXJuIGRvb21lZDtcbiAgICB9KTtcblxuICAgIGlmIChwdXJnZWRJZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUHVyZ2UoW3B1cmdlZElkXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZDtcbiAgfVxufVxuIl19