@decaf-ts/for-fabric 0.4.9 → 0.5.1-query

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.
@@ -253,8 +253,20 @@ export class FabricContractAdapter extends CouchDBAdapter {
253
253
  ...(ctx.getReadCollections() || []),
254
254
  ...(ctx.consumeReadCollections() || []),
255
255
  ]);
256
- for (const col of readCollections)
257
- Object.assign(model, await this.forPrivate(col).readState(composedKey, ctx));
256
+ for (const col of readCollections) {
257
+ try {
258
+ Object.assign(model, await this.forPrivate(col).readState(composedKey, ctx));
259
+ }
260
+ catch (e) {
261
+ const parsed = this.parseError(e);
262
+ if (parsed instanceof NotFoundError)
263
+ continue;
264
+ throw parsed;
265
+ }
266
+ }
267
+ if (!Object.keys(model).length) {
268
+ throw new NotFoundError(`record with id ${id} in table ${tableName} does not exist`);
269
+ }
258
270
  return model;
259
271
  }
260
272
  /**
@@ -469,45 +481,49 @@ export class FabricContractAdapter extends CouchDBAdapter {
469
481
  case "queryResultPaginated": {
470
482
  const [stub, rawInput, limit, , bookmark, ...args] = argsList;
471
483
  const { log } = thisArg["logCtx"](args, prop);
472
- // Fabric has no native pagination API for private data.
473
- // Emulate it: query all matching records (with selector
474
- // and sort preserved), locate the bookmark position in
475
- // the sorted results, then slice to the page size.
484
+ const pageSize = Math.max(1, Number(limit) || 250);
476
485
  const query = { ...rawInput };
477
- delete query.limit;
478
- delete query.skip;
479
- delete query.bookmark;
486
+ // Keep the query CouchDB-compatible and let Fabric/CouchDB own bookmark semantics.
487
+ query.limit = pageSize;
488
+ if (bookmark !== undefined && bookmark !== null && bookmark !== "") {
489
+ query.bookmark = bookmark.toString();
490
+ }
491
+ else {
492
+ delete query.bookmark;
493
+ }
480
494
  log.debug(`Querying collection ${collection} for ${JSON.stringify(query)}`);
481
- let iterator = await stub.getPrivateDataQueryResult(collection, JSON.stringify(query));
482
- iterator = iterator.iterator || iterator;
495
+ const response = await stub.getPrivateDataQueryResult(collection, JSON.stringify(query));
496
+ const iterator = (response.iterator || response);
497
+ const responseMetadata = response.metadata || {};
498
+ const responseBookmark = typeof responseMetadata.bookmark === "string"
499
+ ? responseMetadata.bookmark
500
+ : "";
483
501
  log.verbose(`iterator from collection ${collection} received`);
484
- // Collect all matching records from the iterator
485
- const allResults = [];
486
- while (true) {
487
- const res = await iterator.next();
488
- if (res.value && res.value.value) {
489
- allResults.push({
490
- key: res.value.key,
491
- value: Buffer.isBuffer(res.value.value)
492
- ? res.value.value
493
- : Buffer.from(res.value.value.toString("utf8")),
494
- });
495
- }
496
- if (res.done) {
497
- await iterator.close();
498
- break;
502
+ const paged = [];
503
+ try {
504
+ while (true) {
505
+ const res = await iterator.next();
506
+ if (res.done)
507
+ break;
508
+ if (res.value && res.value.value) {
509
+ const key = res.value.key;
510
+ if (paged.length < pageSize) {
511
+ paged.push({
512
+ key,
513
+ value: Buffer.isBuffer(res.value.value)
514
+ ? res.value.value
515
+ : Buffer.from(res.value.value.toString("utf8")),
516
+ });
517
+ }
518
+ else {
519
+ break; // early exit
520
+ }
521
+ }
499
522
  }
500
523
  }
501
- // Find the bookmark position and slice the page
502
- let startIndex = 0;
503
- if (bookmark) {
504
- const found = allResults.findIndex((r) => r.key === bookmark);
505
- startIndex = found >= 0 ? found + 1 : 0;
524
+ finally {
525
+ await iterator.close();
506
526
  }
507
- const paged = allResults.slice(startIndex, startIndex + limit);
508
- const lastKey = paged.length > 0
509
- ? paged[paged.length - 1].key
510
- : bookmark || "";
511
527
  // Wrap the page in an async iterator for resultIterator()
512
528
  let idx = 0;
513
529
  const arrayIterator = {
@@ -523,7 +539,7 @@ export class FabricContractAdapter extends CouchDBAdapter {
523
539
  iterator: arrayIterator,
524
540
  metadata: {
525
541
  fetchedRecordsCount: paged.length,
526
- bookmark: paged.length >= limit ? lastKey : "",
542
+ bookmark: responseBookmark,
527
543
  },
528
544
  };
529
545
  }
@@ -848,12 +864,16 @@ export class FabricContractAdapter extends CouchDBAdapter {
848
864
  log.silly(`Preparing record for ${tableName} table with pk ${model[pk]}`);
849
865
  const segregatedWriteKeys = ctx.getSegregatedWrites();
850
866
  const segregatedWrites = {};
851
- if (segregatedWriteKeys) {
867
+ // Only apply segregated writes when the current model actually has a transient split.
868
+ // The same FabricContractContext can be reused across nested operations (for example
869
+ // sequence upserts during persistent version generation). In those cases, we must not
870
+ // attempt to apply parent-model segregated write keys to unrelated models.
871
+ if (segregatedWriteKeys && split.transient && typeof split.transient === "object") {
852
872
  for (const collection in segregatedWriteKeys) {
853
873
  segregatedWrites[collection] = segregatedWrites[collection] || {};
854
874
  segregatedWrites[collection][id] = mapToRecord(ctx.getOrUndefined("forceSegregateWrite")
855
875
  ? split.model
856
- : split.transient, segregatedWriteKeys[collection]);
876
+ : (split.transient || {}), segregatedWriteKeys[collection]);
857
877
  }
858
878
  }
859
879
  // In mirror mode, the record should contain ALL model properties (full copy)
@@ -1111,4 +1131,4 @@ export class FabricContractAdapter extends CouchDBAdapter {
1111
1131
  }
1112
1132
  FabricContractAdapter.decoration();
1113
1133
  Adapter.setCurrent(FabricFlavour);
1114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEdBR1osTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSw2QkFBMEI7QUFDMUQsT0FBTyxFQUNMLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLGNBQWMsRUFHZCxrQkFBa0IsR0FDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBRUwsTUFBTSxJQUFJLFlBQVksRUFDdEIsUUFBUSxFQUNSLFFBQVEsSUFBSSxjQUFjLEdBQzNCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxlQUFlLEVBSWYsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFJUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxlQUFlLEVBRWYsT0FBTyxFQVNQLHdCQUF3QixFQUd4QixlQUFlLEVBQ2YseUJBQXlCLEdBQzFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHNDQUFtQztBQU90RSxPQUFPLEVBQUUsZUFBZSxFQUFFLHFDQUFrQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0NBQWlDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUNBQTRCO0FBQ3BELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxxREFBZ0Q7QUFDeEYsT0FBTyxFQUNMLEtBQUss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Q0FBQyxDQUFDO1lBQzNDLENBQUM7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzQyx3REFBd0Q7WUFDeEQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUVELE9BQU8sWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDOztBQUdILHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25DLE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIE1hbmdvUXVlcnksXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQmFzZUVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUHJpbWFyeUtleVR5cGUsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0IGFzIEN0eCxcbiAgT2JqZWN0IGFzIEZhYnJpY09iamVjdCxcbiAgUHJvcGVydHksXG4gIFByb3BlcnR5IGFzIEZhYnJpY1Byb3BlcnR5LFxufSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBTZXF1ZW5jZSxcbiAgU2VxdWVuY2VPcHRpb25zLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBBZGFwdGVyLFxuICBBZGFwdGVyRmxhZ3MsXG4gIFByZXBhcmVkTW9kZWwsXG4gIFJlcG9zaXRvcnksXG4gIFF1ZXJ5RXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBDb250ZXh0dWFsaXplZEFyZ3MsXG4gIENvbnRleHQsXG4gIFJhd1Jlc3VsdCxcbiAgUGFnaW5hdG9yLFxuICBDb250ZXh0dWFsQXJncyxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBNZXRob2RPck9wZXJhdGlvbixcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbiAgRmxhZ3NPZixcbiAgQ29udGV4dE9mLFxuICBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMsXG4gIEV2ZW50SWRzLFxuICBEaXNwYXRjaCxcbiAgcHJvbWlzZVNlcXVlbmNlLFxuICByZXNvbHZlQnVsa1NlcXVlbmNlUmVzdWx0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlU3R1YixcbiAgQ2xpZW50SWRlbnRpdHksXG4gIEl0ZXJhdG9ycyxcbiAgU3RhdGVRdWVyeVJlc3BvbnNlLFxufSBmcm9tIFwiZmFicmljLXNoaW0tYXBpXCI7XG5pbXBvcnQgeyBGYWJyaWNTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RTZXF1ZW5jZSB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0U2VxdWVuY2VcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL1NpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5pbXBvcnQge1xuICBhcHBseSxcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1ldGFkYXRhLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWlzc2luZ0NvbnRleHRFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3REaXNwYXRjaFwiO1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8XG4gIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICBFWFRFTkQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+ID0gQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUywgRVhURU5EPiAmIHtcbiAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBvciB1cGRhdGVyIGZpZWxkIGluIGEgbW9kZWwgYmFzZWQgb24gdGhlIHVzZXIgaW4gdGhlIGNvbnRleHRcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gZGVjb3JhdG9ycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRlZF9ieSBvciB1cGRhdGVkX2J5IGZpZWxkc1xuICogd2l0aCB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgY29udGV4dCB3aGVuIGEgZG9jdW1lbnQgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIE5hbm9SZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtGYWJyaWNDb250cmFjdENvbnRleHR9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyB1c2VyIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb24gbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSB1c2VybmFtZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZhYnJpYy5jb250cmFjdHNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRiBhcyBjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgRi0+PkM6IGdldChcInVzZXJcIilcbiAqICAgQy0tPj5GOiB1c2VyIG9iamVjdFxuICogICBGLT4+TTogc2V0IGtleSB0byB1c2VyLm5hbWVcbiAqICAgTm90ZSBvdmVyIEY6IElmIG5vIHVzZXIgaW4gY29udGV4dFxuICogICBGLS0+PkY6IHRocm93IFVuc3VwcG9ydGVkRXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgQ2xpZW50SWRlbnRpdHk7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIuZ2V0SUQoKSBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIHN0YXRlIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgQ291Y2hEQi1saWtlIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlIGZyb20gd2l0aGluIGEgY2hhaW5jb2RlIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUgdm9pZCAtIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBjb250cmFjdCBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGEgRmFicmljIGNoYWluY29kZSBjb250cmFjdCBjbGFzc1xuICogaW1wb3J0IHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKlxuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBjcmVhdGVBc3NldChjdHg6IENvbnRleHQsIGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IG1vZGVsID0geyBpZCwgZGF0YSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gKiAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSgnYXNzZXRzJywgaWQsIG1vZGVsLCB7fSwgeyBzdHViOiBjdHguc3R1YiB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTdHViXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgY3R4KVxuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IFNlcmlhbGl6ZSBtb2RlbCB0byBKU09OXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IHB1dFN0YXRlKGlkLCBzZXJpYWxpemVkRGF0YSlcbiAqICAgU3R1Yi0+PlN0YXRlREI6IFdyaXRlIGRhdGFcbiAqICAgU3RhdGVEQi0tPj5TdHViOiBTdWNjZXNzXG4gKiAgIFN0dWItLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBTdWNjZXNzXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5Db250cmFjdDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBhbnksXG4gIHZvaWQsXG4gIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRDbGllbnQoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJDbGllbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBGYWJyaWMgY29udHJhY3RzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGJpbmFyeSBkYXRhIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IHNlcmlhbGl6ZXIgPSBuZXcgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIoKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRleHQgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgQ29udGV4dCBjb25zdHJ1Y3RvciB3aXRoIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBDb250ZXh0KCk6IENvbnN0cnVjdG9yPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4ge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIE1hbmdvUXVlcnksIEZhYnJpY0NvbnRyYWN0QWRhcHRlciwgRmFicmljQ29udHJhY3RGbGFncywgRmFicmljQ29udHJhY3RDb250ZXh0Pj59IFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxhbnksIHZvaWQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgb3ZlcnJpZGUgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3RTZXF1ZW5jZShvcHRpb25zLCB0aGlzIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRGlzcGF0Y2g8RmFicmljQ29udHJhY3RBZGFwdGVyPiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdERpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGFuIGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3ZvaWR9IHNjb3BlIC0gTm90IHVzZWQgaW4gdGhpcyBhZGFwdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogdm9pZCwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgRmFicmljRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZm9yKGNvbmZpZzogUGFydGlhbDxhbnk+LCAuLi5hcmdzOiBhbnkpOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLmZvcihjb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1vZGVsRGVmYXVsdHM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBtID0gbmV3IGNsYXp6KCk7XG4gICAgcmV0dXJuIChNZXRhZGF0YS5wcm9wZXJ0aWVzKGNsYXp6KSB8fCBbXSkucmVkdWNlKFxuICAgICAgKGFjYywgcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bcCBhcyBrZXlvZiBNXSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICBhY2NbcCBhcyBrZXlvZiBNXSA9IG1bcCBhcyBrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgc3RvcmVzIGl0IGluIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiBjcmVhdGUgd2l0aCBhcmdzICR7YXJnc31gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bGx5U2VncmVnYXRlZCA9IGN0eC5pc0Z1bGx5U2VncmVnYXRlZCAmJiAhbWlycm9yQ29sbGVjdGlvbjtcblxuICAgIGlmICghbWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgbGV0IGV4aXN0aW5nOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXgtYXNzaWduXG4gICAgICAgIGUgPSB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChleGlzdGluZylcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgYHJlY29yZCB3aXRoIGlkICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfSBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGUgd2l0aCBwayAke2lkfWApO1xuXG4gICAgICBpZiAobWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXRNb2RlbERlZmF1bHRzKGNsYXp6KTtcbiAgICAgICAgLy8gaGFuZGxlIHB1YmxpYyBkYXRhIGlmIG5vdCBmdWxseSBzZWdyZWdhdGVkXG4gICAgICAgIGlmICghZnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMobW9kZWwpLmZpbHRlcigoaykgPT4ge1xuICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQktleXMuVEFCTEUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgICBrIGluIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdHNbayBhcyBrZXlvZiBNXSA9PT0gbW9kZWxba11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5wdXRTdGF0ZShjb21wb3NlZEtleSwgbW9kZWwsIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgc2VncmVnYXRlZCB3cml0ZXNcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJzZWdyZWdhdGVkRGF0YVwiKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gaW4gZGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICAgICAgICBkYXRhW2NvbGxlY3Rpb25dW2lkIGFzIGFueV0sXG4gICAgICAgICAgICAgICAgY3R4XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5jdHhBcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGRlc2VyaWFsaXplcyBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiByZWFkIHdpdGggYXJncyAke2FyZ3N9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTWlycm9yICYmIG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucmVhZFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgICAgICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICB0cnkge1xuICAgICAgbW9kZWwgPSBjdHguaXNGdWxseVNlZ3JlZ2F0ZWRcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkQ29sbGVjdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgLi4uKGN0eC5nZXRSZWFkQ29sbGVjdGlvbnMoKSB8fCBbXSksXG4gICAgICAuLi4oY3R4LmNvbnN1bWVSZWFkQ29sbGVjdGlvbnMoKSB8fCBbXSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgcmVhZENvbGxlY3Rpb25zKVxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2wpLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KVxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuZGVidWcoYFJlYWRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgYnJlYWtPblNpbmdsZUZhaWx1cmUgPSBjdHguZ2V0KFwiYnJlYWtPblNpbmdsZUZhaWx1cmVJbkJ1bGtcIikgPz8gdHJ1ZTtcbiAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSAhYnJlYWtPblNpbmdsZUZhaWx1cmU7XG5cbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWFkTWlycm9yID0gYXN5bmMgPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCFtaXJyb3JDb2xsZWN0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEVycm9yKFwiTWlzc2luZyBtaXJyb3IgY29sbGVjdGlvbiBmb3IgbWlycm9yIHJlYWRcIik7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCByZWFkTWlycm9yKTtcbiAgICAgICAgbG9nLmluZm8oYGluIEFEQVBURVIgcmVhZCB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1xuICAgICAgICAgIFN0cmluZyhpZCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucmVhZFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXNrcyA9IGlkLm1hcChcbiAgICAgICAgKGkpID0+ICgpID0+XG4gICAgICAgICAgaXNNaXJyb3IgJiYgbWlycm9yQ29sbGVjdGlvblxuICAgICAgICAgICAgPyByZWFkTWlycm9yKFxuICAgICAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgICAgICBjdHgub3ZlcnJpZGUoeyBub0VtaXRTaW5nbGU6IHRydWUgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnJlYWQoY2xhenosIGksIC4uLmFyZ3MsIGN0eC5vdmVycmlkZSh7IG5vRW1pdFNpbmdsZTogdHJ1ZSB9KSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IGNvbnRpbnVlT25FcnJvclxuICAgICAgICA/IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcywgdHJ1ZSlcbiAgICAgICAgOiBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MpO1xuICAgICAgcmV0dXJuIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQoXG4gICAgICAgIHJhd1Jlc3VsdCxcbiAgICAgICAgY29udGludWVPbkVycm9yLFxuICAgICAgICBsb2csXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgdXBkYXRlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG5cbiAgICB0aGlzLmVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uKGNsYXp6LCBjdHgpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIHVwZGF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYHVwZGF0aW5nIGVudHJ5IGluICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7aWR9YCk7XG5cbiAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldE1vZGVsRGVmYXVsdHMoY2xhenopO1xuICAgICAgICAvLyBoYW5kbGUgcHVibGljIGRhdGFcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5rZXlzKG1vZGVsKS5maWx0ZXIoKGspID0+IHtcbiAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCS2V5cy5UQUJMRSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgIGsgaW4gZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgZGVmYXVsdHNbayBhcyBrZXlvZiBNXSA9PT0gbW9kZWxba11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkubGVuZ3RoXG4gICAgICAgIClcbiAgICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucHV0U3RhdGUoY29tcG9zZWRLZXksIG1vZGVsLCBjdHgpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBzZWdyZWdhdGVkIHdyaXRlc1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmdldEZyb21DaGlsZHJlbihcInNlZ3JlZ2F0ZWREYXRhXCIpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBpbiBkYXRhKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgICAgICAgIGRhdGFbY29sbGVjdGlvbl1baWQgYXMgYW55XSxcbiAgICAgICAgICAgICAgICBjdHhcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlY29yZCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuXG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgaWYgKG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnJlYWRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gY3R4LmlzRnVsbHlTZWdyZWdhdGVkXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgICAgIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyBlbnRyeSAke2NvbXBvc2VkS2V5fSBmcm9tIHB1YmxpYyBsZWRnZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBjdHguZ2V0UmVhZENvbGxlY3Rpb25zKCk7XG4gICAgICBpZiAoY29sbGVjdGlvbnMgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgYGVuc3VyaW5nIGNvbGxlY3Rpb24gJHtjb2x9IGhhcyBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX0gYmVmb3JlIGRlbGV0aW5nYFxuICAgICAgICAgICk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbCkucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgRGVsZXRpbmcgcHJpdmF0ZSBjb2xsZWN0aW9uICR7Y29sfSBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sKS5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlU3RhdGUoaWQ6IHN0cmluZywgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgYXdhaXQgY29udGV4dC5zdHViLmRlbGV0ZVN0YXRlKGlkKTtcbiAgfVxuXG4gIGZvclByaXZhdGUoY29sbGVjdGlvbjogc3RyaW5nKTogRmFicmljQ29udHJhY3RBZGFwdGVyIHtcbiAgICBjb25zdCB0b092ZXJyaWRlID0gW1xuICAgICAgdGhpcy5wdXRTdGF0ZSxcbiAgICAgIHRoaXMucmVhZFN0YXRlLFxuICAgICAgdGhpcy5kZWxldGVTdGF0ZSxcbiAgICAgIHRoaXMucXVlcnlSZXN1bHQsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkLFxuICAgIF0ubWFwKChmbikgPT4gZm4ubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAoIXRvT3ZlcnJpZGUuaW5jbHVkZXMocHJvcCBhcyBzdHJpbmcpKVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSgodGFyZ2V0IGFzIGFueSlbcHJvcF0sIHtcbiAgICAgICAgICBhc3luYyBhcHBseShmbiwgdGhpc0FyZywgYXJnc0xpc3QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgICAgICAgICBjYXNlIFwicHV0U3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIC8vIHB1dFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dClcbiAgICAgICAgICAgICAgICBjb25zdCBbaWQsIG1vZGVsLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgd3JpdGUgdG8gJHtjb2xsZWN0aW9ufSBmb3IgJHtpZC50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwgYXMgTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5wdXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVTdGF0ZSBzaWduYXR1cmU6IChpZDogc3RyaW5nLCBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICAgICAgICAgICAgY29uc3QgW2lkLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgZGVsZXRlIG9uICR7Y29sbGVjdGlvbn0gZm9yICR7aWQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5kZWxldGVQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInJlYWRTdGF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgLy8gcmVhZFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KVxuICAgICAgICAgICAgICAgIGNvbnN0IFtpZCwgY3R4XSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHByb3ApO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBQcml2YXRlIHJlYWQgZnJvbSAke2NvbGxlY3Rpb259IGZvciAke2lkLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGN0eC5zdHViLmdldFByaXZhdGVEYXRhKGNvbGxlY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudG9TdHJpbmcoKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCAuLi5hcmdzXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKGFyZ3MsIHByb3ApO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBRdWVyeWluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gZm9yICR7SlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgICAgICBgaXRlcmF0b3IgZnJvbSBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5pdGVyYXRvciB8fCByZXM7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFBhZ2luYXRlZFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCBsaW1pdCwgLCBib29rbWFyaywgLi4uYXJnc10gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvZyB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShhcmdzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAvLyBGYWJyaWMgaGFzIG5vIG5hdGl2ZSBwYWdpbmF0aW9uIEFQSSBmb3IgcHJpdmF0ZSBkYXRhLlxuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgaXQ6IHF1ZXJ5IGFsbCBtYXRjaGluZyByZWNvcmRzICh3aXRoIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNvcnQgcHJlc2VydmVkKSwgbG9jYXRlIHRoZSBib29rbWFyayBwb3NpdGlvbiBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBzb3J0ZWQgcmVzdWx0cywgdGhlbiBzbGljZSB0byB0aGUgcGFnZSBzaXplLlxuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0geyAuLi5yYXdJbnB1dCB9O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBxdWVyeS5saW1pdDtcbiAgICAgICAgICAgICAgICBkZWxldGUgcXVlcnkuc2tpcDtcbiAgICAgICAgICAgICAgICBkZWxldGUgcXVlcnkuYm9va21hcms7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFF1ZXJ5aW5nIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufSBmb3IgJHtKU09OLnN0cmluZ2lmeShxdWVyeSl9YFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBhd2FpdCAoXG4gICAgICAgICAgICAgICAgICBzdHViIGFzIENoYWluY29kZVN0dWJcbiAgICAgICAgICAgICAgICApLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoY29sbGVjdGlvbiwgSlNPTi5zdHJpbmdpZnkocXVlcnkpKTtcbiAgICAgICAgICAgICAgICBpdGVyYXRvciA9IChpdGVyYXRvciBhcyBhbnkpLml0ZXJhdG9yIHx8IGl0ZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgbG9nLnZlcmJvc2UoYGl0ZXJhdG9yIGZyb20gY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IHJlY2VpdmVkYCk7XG4gICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWF0Y2hpbmcgcmVjb3JkcyBmcm9tIHRoZSBpdGVyYXRvclxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlc3VsdHM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBCdWZmZXIgfT4gPSBbXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJlcy52YWx1ZS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEJ1ZmZlci5pc0J1ZmZlcihyZXMudmFsdWUudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlcy52YWx1ZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnZhbHVlLnZhbHVlIGFzIGFueSkudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGJvb2ttYXJrIHBvc2l0aW9uIGFuZCBzbGljZSB0aGUgcGFnZVxuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoYm9va21hcmspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gYWxsUmVzdWx0cy5maW5kSW5kZXgoKHIpID0+IHIua2V5ID09PSBib29rbWFyayk7XG4gICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZm91bmQgPj0gMCA/IGZvdW5kICsgMSA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VkID0gYWxsUmVzdWx0cy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgbGltaXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RLZXkgPVxuICAgICAgICAgICAgICAgICAgcGFnZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHBhZ2VkW3BhZ2VkLmxlbmd0aCAtIDFdLmtleVxuICAgICAgICAgICAgICAgICAgICA6IGJvb2ttYXJrIHx8IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBwYWdlIGluIGFuIGFzeW5jIGl0ZXJhdG9yIGZvciByZXN1bHRJdGVyYXRvcigpXG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBwYWdlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcGFnZWRbaWR4KytdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQgYXMgYW55LCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYXN5bmMgY2xvc2UoKSB7fSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOlxuICAgICAgICAgICAgICAgICAgICBhcnJheUl0ZXJhdG9yIGFzIHVua25vd24gYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IHBhZ2VkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9va21hcms6IHBhZ2VkLmxlbmd0aCA+PSBsaW1pdCA/IGxhc3RLZXkgOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgbWV0aG9kIG92ZXJyaWRlICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwdXRTdGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICkge1xuICAgIGxldCBkYXRhOiBCdWZmZXI7XG5cbiAgICB0cnkge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwgYXMgTW9kZWwsIGZhbHNlKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSByZWNvcmQgd2l0aCBpZCAke2lkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGN0eC5zdHViLnB1dFN0YXRlKGlkLnRvU3RyaW5nKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRTdGF0ZShpZDogc3RyaW5nLCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCkge1xuICAgIGxldCByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChbY3R4XSwgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGNvbnN0IHJlcyA9IChhd2FpdCBjdHguc3R1Yi5nZXRTdGF0ZShpZC50b1N0cmluZygpKSkudG9TdHJpbmcoKTtcbiAgICBpZiAoIXJlcykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIGxvZy5zaWxseShgc3RhdGUgcmV0cmlldmVkIHVuZGVyIGlkICR7aWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlcy50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcmVjb3JkOiAke2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiB7XG4gICAgcmV0dXJuIHN0dWIuZ2V0UXVlcnlSZXN1bHQoSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdFBhZ2luYXRlZChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG4gICAgbGltaXQ6IG51bWJlciA9IDI1MCxcbiAgICBwYWdlPzogbnVtYmVyLFxuICAgIGJvb2ttYXJrPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPj4ge1xuICAgIHJldHVybiBzdHViLmdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24oXG4gICAgICBKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksXG4gICAgICBsaW1pdCxcbiAgICAgIGJvb2ttYXJrPy50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBiaW5hcnkgZGF0YSB0byBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIGRlY29kZShidWZmZXI6IFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLnRleHREZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgRmFicmljIGNvbnRyYWN0IG9wZXJhdGlvbnNcbiAgICogQHN1bW1hcnkgTWVyZ2VzIGRlZmF1bHQgZmxhZ3Mgd2l0aCBGYWJyaWMtc3BlY2lmaWMgY29udGV4dCBpbmZvcm1hdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZhYnJpY0NvbnRyYWN0RmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0c1xuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcmV0dXJuIHtGYWJyaWNDb250cmFjdEZsYWdzfSBUaGUgbWVyZ2VkIGZsYWdzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IEFsbE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NvbnRyYWN0RmxhZ3M+IHwgRmFicmljQ29udHJhY3RDb250ZXh0IHwgQ3R4IHwgYW55XG4gICk6IFByb21pc2U8RmFicmljQ29udHJhY3RGbGFncz4ge1xuICAgIGxldCBiYXNlRmxhZ3MgPSB7XG4gICAgICBzZWdyZWdhdGVkOiBmYWxzZSxcbiAgICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgICAgIGZ1bGx5U2VncmVnYXRlZDogZmFsc2UsXG4gICAgfTtcbiAgICBpZiAoZmxhZ3MgaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQgfHwgZmxhZ3MgaW5zdGFuY2VvZiBDb250ZXh0KSB7XG4gICAgICBmbGFncyA9IGZsYWdzLnRvT3ZlcnJpZGVzKCk7XG4gICAgfVxuXG4gICAgYmFzZUZsYWdzID0gT2JqZWN0LmFzc2lnbihiYXNlRmxhZ3MsIGZsYWdzKTtcbiAgICBjb25zdCBzdHViRnJvbUZsYWdzID1cbiAgICAgIChmbGFncyBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnN0dWIgfHwgKGZsYWdzIGFzIEN0eCkuc3R1YjtcbiAgICBjb25zdCBpZGVudGl0eUZyb21GbGFncyA9XG4gICAgICAoZmxhZ3MgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5pZGVudGl0eSB8fFxuICAgICAgKGZsYWdzIGFzIEN0eCkuY2xpZW50SWRlbnRpdHk7XG4gICAgaWYgKHN0dWJGcm9tRmxhZ3MgJiYgaWRlbnRpdHlGcm9tRmxhZ3MpIHtcbiAgICAgIGNvbnN0IHR4SWQgPSBzdHViRnJvbUZsYWdzLmdldFR4SUQoKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCB7XG4gICAgICAgIHN0dWI6IHN0dWJGcm9tRmxhZ3MsXG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eUZyb21GbGFncyxcbiAgICAgICAgY2VydDogaWRlbnRpdHlGcm9tRmxhZ3MuZ2V0SURCeXRlcygpLnRvU3RyaW5nKCksXG4gICAgICAgIHJvbGVzOiBpZGVudGl0eUZyb21GbGFncy5nZXRBdHRyaWJ1dGVWYWx1ZShcInJvbGVzXCIpLFxuICAgICAgICBsb2dnZXI6IExvZ2dpbmcuZm9yKFxuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2dMZXZlbDogZmFsc2UsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGZhbHNlLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHhJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZsYWdzXG4gICAgICAgICksXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR4SWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZUZsYWdzID0gT2JqZWN0LmFzc2lnbihiYXNlRmxhZ3MsIGZsYWdzIHx8IHt9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF3YWl0IHN1cGVyLmZsYWdzKFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgbW9kZWwsXG4gICAgICBiYXNlRmxhZ3MgYXMgYW55XG4gICAgKSkgYXMgRmFicmljQ29udHJhY3RGbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmRleCBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEZhYnJpYyBjb250cmFjdHMgYW5kIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaW5kZXg8TT4obW9kZWxzOiBDb25zdHJ1Y3RvcjxNPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHJlc3VsdHMgZnJvbSBhIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIHRocm91Z2ggcXVlcnkgcmVzdWx0cyBhbmQgY29udmVydHMgdGhlbSB0byBhIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcGFyYW0ge0l0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3J9IGl0ZXJhdG9yIC0gVGhlIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSGlzdG9yeT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgaXMgYSBoaXN0b3J5IHF1ZXJ5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBwcm9jZXNzZWQgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSZXN1bHRJdGVyYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEl0ZXJhdG9yXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmVzdWx0SXRlcmF0b3I6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IsIGlzSGlzdG9yeSlcbiAgICogICBsb29wIFVudGlsIGRvbmVcbiAgICogICAgIFJlc3VsdEl0ZXJhdG9yLT4+SXRlcmF0b3I6IG5leHQoKVxuICAgKiAgICAgSXRlcmF0b3ItLT4+UmVzdWx0SXRlcmF0b3I6IHsgdmFsdWUsIGRvbmUgfVxuICAgKiAgICAgYWx0IEhhcyB2YWx1ZVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBQcm9jZXNzIHZhbHVlIGJhc2VkIG9uIGlzSGlzdG9yeVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBBZGQgdG8gcmVzdWx0cyBhcnJheVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmVzdWx0SXRlcmF0b3ItPj5JdGVyYXRvcjogY2xvc2UoKVxuICAgKiAgIFJlc3VsdEl0ZXJhdG9yLS0+PkNhbGxlcjogYWxsUmVzdWx0c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3VsdEl0ZXJhdG9yKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIGl0ZXJhdG9yOiBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgIGlzSGlzdG9yeSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IGFsbFJlc3VsdHMgPSBbXTtcbiAgICBsZXQgcmVzOiB7IHZhbHVlOiBhbnk7IGRvbmU6IGJvb2xlYW4gfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICB3aGlsZSAoIXJlcy5kb25lKSB7XG4gICAgICBpZiAocmVzLnZhbHVlICYmIHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgIGxldCBqc29uUmVzOiBhbnkgPSB7fTtcbiAgICAgICAgbG9nLmRlYnVnKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICBpZiAoaXNIaXN0b3J5IC8qICYmIGlzSGlzdG9yeSA9PT0gdHJ1ZSovKSB7XG4gICAgICAgICAganNvblJlcy5UeElkID0gcmVzLnZhbHVlLnR4SWQ7XG4gICAgICAgICAganNvblJlcy5UaW1lc3RhbXAgPSByZXMudmFsdWUudGltZXN0YW1wO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gSlNPTi5wYXJzZShyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25SZXMgPSBKU09OLnBhcnNlKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGpzb25SZXMgPSByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhbGxSZXN1bHRzLnB1c2goanNvblJlcyk7XG4gICAgICB9XG4gICAgICByZXMgPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgQ2xvc2luZyBpdGVyYXRvciBhZnRlciAke2FsbFJlc3VsdHMubGVuZ3RofSByZXN1bHRzYCk7XG4gICAgYXdhaXQgaXRlcmF0b3IuY2xvc2UoKTtcbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSByaWNoIHF1ZXJ5IHVzaW5nIENvdWNoREIgc3ludGF4IGFnYWluc3QgdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdHViXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogcmF3KHJhd0lucHV0LCBkb2NzT25seSwgY3R4KVxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogRXh0cmFjdCBsaW1pdCBhbmQgc2tpcFxuICAgKiAgIGFsdCBXaXRoIHBhZ2luYXRpb25cbiAgICogICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IGdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24ocXVlcnksIGxpbWl0LCBza2lwKVxuICAgKiAgIGVsc2UgV2l0aG91dCBwYWdpbmF0aW9uXG4gICAqICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBnZXRRdWVyeVJlc3VsdChxdWVyeSlcbiAgICogICBlbmRcbiAgICogICBTdHViLT4+U3RhdGVEQjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIFN0YXRlREItLT4+U3R1YjogSXRlcmF0b3JcbiAgICogICBTdHViLS0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogSXRlcmF0b3JcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IpXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLS0+PkNhbGxlcjogcmVzdWx0c1xuICAgKi9cbiAgYXN5bmMgcmF3PFIsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICBkb2NzT25seTogRCA9IHRydWUgYXMgRCxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmF3UmVzdWx0PFIsIEQ+PiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuXG4gICAgY29uc3QgZW5hYmxlU2VncmVnYXRlcyA9ICFhcmdzLmxlbmd0aCB8fCBhcmdzWzBdICE9PSB0cnVlO1xuICAgIGNvbnN0IGZ1bGx5U2VncmVnYXRlZCA9IGVuYWJsZVNlZ3JlZ2F0ZXMgJiYgY3R4LmlzRnVsbHlTZWdyZWdhdGVkO1xuXG4gICAgY29uc3QgeyBza2lwLCBsaW1pdCB9ID0gcmF3SW5wdXQ7XG4gICAgY29uc3QgYm9va21hcmsgPSByYXdJbnB1dFtcImJvb2ttYXJrXCJdO1xuICAgIGxldCByZXNwID0geyBkb2NzOiBbXSwgYm9va21hcms6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAgIC8vIFF1ZXJ5IHB1YmxpYyBzdGF0ZSBvbmx5IHdoZW4gdGhlIG1vZGVsIGlzIE5PVCBmdWxseSBzZWdyZWdhdGVkXG4gICAgaWYgKCFmdWxseVNlZ3JlZ2F0ZWQpIHtcbiAgICAgIGxldCBpdGVyYXRvcjogSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcjtcbiAgICAgIGlmIChsaW1pdCB8fCBza2lwKSB7XG4gICAgICAgIGRlbGV0ZSByYXdJbnB1dFtcImxpbWl0XCJdO1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJza2lwXCJdO1xuICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgYFJldHJpZXZpbmcgcHVibGljIHBhZ2luYXRlZCBpdGVyYXRvcjogbGltaXQ6ICR7bGltaXR9LyBza2lwOiAke3NraXB9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXNwb25zZTogU3RhdGVRdWVyeVJlc3BvbnNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+ID1cbiAgICAgICAgICAoYXdhaXQgdGhpcy5xdWVyeVJlc3VsdFBhZ2luYXRlZChcbiAgICAgICAgICAgIGN0eC5zdHViLFxuICAgICAgICAgICAgcmF3SW5wdXQsXG4gICAgICAgICAgICBsaW1pdCB8fCBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgKHNraXAgYXMgYW55KT8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGJvb2ttYXJrLFxuICAgICAgICAgICAgLi4uW2N0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICAgICAgICAgKSkgYXMgU3RhdGVRdWVyeVJlc3BvbnNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+O1xuICAgICAgICByZXNwLmJvb2ttYXJrID0gcmVzcG9uc2UubWV0YWRhdGEuYm9va21hcms7XG4gICAgICAgIGl0ZXJhdG9yID0gcmVzcG9uc2UuaXRlcmF0b3I7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmVkIHB1YmxpYyBwYWdpbmcgaXRlcmF0b3JgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhcIlJldHJpZXZpbmcgbGlzdGluZyBwdWJsaWMgaXRlcmF0b3JcIik7XG4gICAgICAgIGl0ZXJhdG9yID0gKGF3YWl0IHRoaXMucXVlcnlSZXN1bHQoXG4gICAgICAgICAgY3R4LnN0dWIsXG4gICAgICAgICAgcmF3SW5wdXQsXG4gICAgICAgICAgY3R4XG4gICAgICAgICkpIGFzIEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFJldHJpZXZlZCBwdWJsaWMgbGlzdGluZyBpdGVyYXRvcmApO1xuXG4gICAgICByZXNwLmRvY3MgPSAoYXdhaXQgdGhpcy5yZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yKSkgYXMgYW55O1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgcmV0dXJuaW5nICR7QXJyYXkuaXNBcnJheShyZXNwLmRvY3MpID8gcmVzcC5kb2NzLmxlbmd0aCA6IDF9IHJlc3VsdHNgXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgZnVsbHkgc2VncmVnYXRlZCBtb2RlbHMsIHN0cmlwIHBhZ2luYXRpb24gZmllbGRzIGZyb20gcmF3SW5wdXRcbiAgICAgIC8vIHNvIHRoZSBzZWdyZWdhdGVkIHF1ZXJ5IGJlbG93IGNhbiByZS1hcHBseSB0aGVtIGNsZWFubHlcbiAgICAgIGlmIChsaW1pdCB8fCBza2lwKSB7XG4gICAgICAgIGRlbGV0ZSByYXdJbnB1dFtcImxpbWl0XCJdO1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJza2lwXCJdO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKFwiU2tpcHBpbmcgcHVibGljIHN0YXRlIHF1ZXJ5IChmdWxseSBzZWdyZWdhdGVkIG1vZGVsKVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9ucyA9IGVuYWJsZVNlZ3JlZ2F0ZXMgPyBjdHguZ2V0UmVhZENvbGxlY3Rpb25zKCkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoY29sbGVjdGlvbnMgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAvLyBCdWlsZCBhIGZyZXNoIGlucHV0IHdpdGggbGltaXQvc2tpcC9ib29rbWFyayByZXN0b3JlZFxuICAgICAgY29uc3Qgc2VncmVnYXRlZElucHV0ID0geyAuLi5yYXdJbnB1dCB9O1xuICAgICAgaWYgKGxpbWl0KSBzZWdyZWdhdGVkSW5wdXQubGltaXQgPSBsaW1pdDtcbiAgICAgIGlmIChza2lwKSBzZWdyZWdhdGVkSW5wdXQuc2tpcCA9IHNraXA7XG4gICAgICBpZiAoYm9va21hcmspIHNlZ3JlZ2F0ZWRJbnB1dFtcImJvb2ttYXJrXCJdID0gYm9va21hcms7XG5cbiAgICAgIGNvbnN0IHNlZ3JlZ2F0ZWQ6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgY29sbGVjdGlvbnMpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBRdWVyeWluZyBmcm9tICR7Y29sbGVjdGlvbn1gKTtcbiAgICAgICAgY29uc3QgZnJvbUNvbHMgPSBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sbGVjdGlvbikucmF3KFxuICAgICAgICAgIHsgLi4uc2VncmVnYXRlZElucHV0IH0sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICAgIGByZWNlaXZlZCAkeyhmcm9tQ29scyBhcyB1bmtub3duIGFzIGFueVtdKS5sZW5ndGh9IGZyb20gJHtjb2xsZWN0aW9ufWBcbiAgICAgICAgKTtcbiAgICAgICAgc2VncmVnYXRlZC5wdXNoKGZyb21Db2xzKTtcbiAgICAgIH1cbiAgICAgIC8vIGNob29zZSB0aGUgcmVzcG9uc2Ugd2l0aCB0aGUgbW9zdCByZXN1bHRzXG4gICAgICByZXNwID0gc2VncmVnYXRlZC5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICBpZiAoIWFjYykgcmV0dXJuIGN1cnI7XG4gICAgICAgIGlmIChjdXJyLmRvY3MgJiYgY3Vyci5kb2NzLmxlbmd0aCA+PSBhY2M/LmRvY3MubGVuZ3RoKSByZXR1cm4gY3VycjtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHJlc3ApO1xuICAgIH1cblxuICAgIGlmIChkb2NzT25seSkge1xuICAgICAgcmV0dXJuIHJlc3AuZG9jcyBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiByZXNwIGFzIGFueTtcbiAgfVxuXG4gIGFzeW5jIHZpZXc8Uj4oXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRkb2M6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgdmlld05hbWU6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uX2FyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxWaWV3UmVzcG9uc2U8Uj4+IHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiRmFicmljIGNvbnRyYWN0cyBkbyBub3Qgc3VwcG9ydCBDb3VjaERCIHZpZXdzLlwiXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8QWRhcHRlckZsYWdzPlxuICApOiBGYWJyaWNTdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNTdGF0ZW1lbnQodGhpcyBhcyBhbnksIG92ZXJyaWRlcyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTGFiZWwgPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBsb2cuZGVidWcoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVMYWJlbH0gdGFibGVgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uY3R4QXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcmVwYXJlZE1vZGVsICYge1xuICAgIHNlZ3JlZ2F0ZWQ/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbiAgfSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdDogU2VncmVnYXRlZE1vZGVsPE0+ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gICAgY29uc3QgaWQgPSBtb2RlbFtwayBhcyBrZXlvZiBNXTtcblxuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBtYXBUb1JlY29yZCA9IGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0NvbnRyYWN0QWRhcHRlcixcbiAgICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGtleXNPdmVycmlkZT86IHN0cmluZ1tdXG4gICAgKSB7XG4gICAgICBpZiAoa2V5c092ZXJyaWRlKVxuICAgICAgICBrZXlzT3ZlcnJpZGUgPSBbLi4ubmV3IFNldChbLi4ua2V5c092ZXJyaWRlLCBwayBhcyBzdHJpbmddKV07XG4gICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhvYmopLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgICBpZiAoa2V5c092ZXJyaWRlICYmICFrZXlzT3ZlcnJpZGUuaW5jbHVkZXMoa2V5KSkgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBNb2RlbC5jb2x1bW5OYW1lKG1vZGVsLCBrZXkgYXMgYW55KTtcbiAgICAgICAgICBpZiAodGhpcy5pc1Jlc2VydmVkKG1hcHBlZFByb3ApKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFByb3BlcnR5IG5hbWUgJHttYXBwZWRQcm9wfSBpcyByZXNlcnZlZGApO1xuICAgICAgICAgIHZhbCA9IHZhbCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZSh2YWwpIDogdmFsO1xuICAgICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVzdWx0KS5maWx0ZXIoKGspID0+IEJvb2xlYW4ocmVzdWx0W2tdKSkubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFkZCB0YWJsZSBpZGVudGlmaWVyXG4gICAgICAgIHJlc3VsdFtDb3VjaERCS2V5cy5UQUJMRV0gPSB0YWJsZU5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0uYmluZCh0aGlzKTtcblxuICAgIGxvZy5zaWxseShcbiAgICAgIGBQcmVwYXJpbmcgcmVjb3JkIGZvciAke3RhYmxlTmFtZX0gdGFibGUgd2l0aCBwayAkeyhtb2RlbCBhcyBhbnkpW3BrXX1gXG4gICAgKTtcblxuICAgIGNvbnN0IHNlZ3JlZ2F0ZWRXcml0ZUtleXMgPSBjdHguZ2V0U2VncmVnYXRlZFdyaXRlcygpO1xuICAgIGNvbnN0IHNlZ3JlZ2F0ZWRXcml0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAoc2VncmVnYXRlZFdyaXRlS2V5cykge1xuICAgICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIGluIHNlZ3JlZ2F0ZWRXcml0ZUtleXMpIHtcbiAgICAgICAgc2VncmVnYXRlZFdyaXRlc1tjb2xsZWN0aW9uXSA9IHNlZ3JlZ2F0ZWRXcml0ZXNbY29sbGVjdGlvbl0gfHwge307XG4gICAgICAgIHNlZ3JlZ2F0ZWRXcml0ZXNbY29sbGVjdGlvbl1baWQgYXMgYW55XSA9IG1hcFRvUmVjb3JkKFxuICAgICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImZvcmNlU2VncmVnYXRlV3JpdGVcIilcbiAgICAgICAgICAgID8gc3BsaXQubW9kZWxcbiAgICAgICAgICAgIDogKHNwbGl0LnRyYW5zaWVudCBhcyBhbnkpLFxuICAgICAgICAgIHNlZ3JlZ2F0ZWRXcml0ZUtleXNbY29sbGVjdGlvbl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbiBtaXJyb3IgbW9kZSwgdGhlIHJlY29yZCBzaG91bGQgY29udGFpbiBBTEwgbW9kZWwgcHJvcGVydGllcyAoZnVsbCBjb3B5KVxuICAgIGNvbnN0IHJlY29yZCA9IGlzTWlycm9yID8gbWFwVG9SZWNvcmQobW9kZWwpIDogbWFwVG9SZWNvcmQoc3BsaXQubW9kZWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZCxcbiAgICAgIGlkOiAobW9kZWwgYXMgYW55KVtwa10gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OlxuICAgICAgICAhaXNNaXJyb3IgJiYgc3BsaXQudHJhbnNpZW50ICYmIE9iamVjdC5rZXlzKHNwbGl0LnRyYW5zaWVudCkubGVuZ3RoXG4gICAgICAgICAgPyBtYXBUb1JlY29yZChzcGxpdC50cmFuc2llbnQpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzZWdyZWdhdGVkOiBpc01pcnJvciA/IHVuZGVmaW5lZCA6IHNlZ3JlZ2F0ZWRXcml0ZXMsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBjb25zdCBwa1Byb3BzID0gTW9kZWwucGtQcm9wcyhjbGF6eik7XG4gICAgaWYgKHBrUHJvcHM/LnR5cGUgPT09IE51bWJlciAmJiB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlkID0gTnVtYmVyKGlkKTtcbiAgICB9XG4gICAgb2JbcGsgYXMgc3RyaW5nXSA9IGlkO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke2NsYXp6Lm5hbWV9IGlkICR7aWR9YCk7XG5cbiAgICBmdW5jdGlvbiBtYXBUb01vZGVsKHI6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICAgIGNvbnN0IG0gPSAoXG4gICAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgICApIGFzIE07XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gTW9kZWwuZ2V0QXR0cmlidXRlcyhjbGF6eik7XG4gICAgICBjb25zdCBrZXlzID0gYXR0cmlidXRlcy5sZW5ndGggPyBhdHRyaWJ1dGVzIDogT2JqZWN0LmtleXMobSk7XG4gICAgICByZXR1cm4ga2V5c1xuICAgICAgICAuZmlsdGVyKChrKSA9PiBrICE9PSAocGsgYXMgc3RyaW5nKSlcbiAgICAgICAgLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAgICAgICAgIHJbTW9kZWwuY29sdW1uTmFtZShhY2N1bSwga2V5IGFzIGFueSldO1xuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSwgbSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IG1hcFRvTW9kZWwob2JqKTtcblxuICAgIGlmICh0cmFuc2llbnQgJiYgIXRoaXMuc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoY3R4KSkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgZmlsdGVyaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICByZXN1bHQgPSBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgoYWNjLCBba2V5LCB2XSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBwayB8fCAhKGtleSBpbiB0cmFuc2llbnQpKSB7XG4gICAgICAgICAgYWNjW2tleSBhcyBrZXlvZiBNXSA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIG5ldyBjbGF6eigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICghY3R4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJvcGVyYXRpb25cIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghb3BlcmF0aW9uKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuICFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMubWFwKChrKSA9PiBrLnRvTG93ZXJDYXNlKCkpLmluY2x1ZGVzKG9wKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dE1zcChjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgQ2xpZW50SWRlbnRpdHlcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gICAgaWYgKCFtaXJyb3JNZXRhKSByZXR1cm47XG4gICAgY29uc3QgbXNwID0gdGhpcy5nZXRDb250ZXh0TXNwKGN0eCk7XG4gICAgaWYgKCFtc3ApIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAgIChtaXJyb3JNZXRhLmNvbmRpdGlvbiAmJiBtaXJyb3JNZXRhLmNvbmRpdGlvbihtc3ApKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNyZWF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdIGFzIFtcbiAgICAgIENvbnN0cnVjdG9yPE0+LFxuICAgICAgUHJpbWFyeUtleVR5cGUsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgLi4uYW55W10sXG4gICAgICBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZVByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IGFueVtdIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcblxuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXSBhcyBbXG4gICAgICBDb25zdHJ1Y3RvcjxNPixcbiAgICAgIFByaW1hcnlLZXlUeXBlLFxuICAgICAgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIC4uLmFueVtdLFxuICAgICAgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogWy4uLmFueSwgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICApOiAoc3RyaW5nIHwgc3RyaW5nW10gfCBudW1iZXJbXSB8IFJlY29yZDxzdHJpbmcsIGFueT5bXSlbXSB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG5cbiAgICBjb25zdCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogWy4uLmFueSwgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICApIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRzLCByZWNvcmRzLCBjdHggYXMgYW55XTtcbiAgfVxuXG4gIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oXG4gICAgZXJyOiBFcnJvciB8IHN0cmluZyxcbiAgICByZWFzb24/OiBzdHJpbmdcbiAgKTogRSB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5wYXJzZUVycm9yKHJlYXNvbiB8fCBlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9EXG4gICk6IEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IGZhbHNlXG4gICk6IEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IHRydWUsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGbGFnc09mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4+XG4gICk6IFByb21pc2U8XG4gICAgRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT5cbiAgPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9ELFxuICAgIGFsbG93Q3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxGbGFnc09mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4+IHwgQ3R4XG4gICk6XG4gICAgfCBQcm9taXNlPFxuICAgICAgICBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPlxuICAgICAgPlxuICAgIHwgRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT4ge1xuICAgIGlmICghYWxsb3dDcmVhdGUpXG4gICAgICByZXR1cm4gc3VwZXIubG9nQ3R4PEFSR1MsIE1FVEhPRD4oXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIG9wZXJhdGlvbiBhcyBhbnksXG4gICAgICAgIGFsbG93Q3JlYXRlIGFzIGFueSxcbiAgICAgICAgb3ZlcnJpZGVzIGFzIGFueVxuICAgICAgKSBhcyBhbnk7XG5cbiAgICByZXR1cm4gc3VwZXIubG9nQ3R4XG4gICAgICAuY2FsbCh0aGlzLCBhcmdzLCBvcGVyYXRpb24gYXMgYW55LCBhbGxvd0NyZWF0ZSwgb3ZlcnJpZGVzIGFzIGFueSlcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgaWYgKCEocmVzLmN0eCBpbnN0YW5jZW9mIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgY29udGV4dCBiaW5kaW5nYCk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlcywge1xuICAgICAgICAgIHN0dWI6IHJlcy5jdHguc3R1YixcbiAgICAgICAgICBpZGVudGl0eTogcmVzLmN0eC5pZGVudGl0eSxcbiAgICAgICAgfSk7XG4gICAgICB9KSBhcyBhbnk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgaWYgKGN0eC5pc0Z1bGx5U2VncmVnYXRlZCkgcmV0dXJuO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJub0VtaXRcIikpIHJldHVybjtcbiAgICBpZiAoIWN0eC5zdHViKSByZXR1cm47XG4gICAgY29uc3QgaXNCdWxrID0gQXJyYXkuaXNBcnJheShpZCk7XG4gICAgY29uc3QgZW1pdFNpbmdsZSA9ICFjdHguZ2V0T3JVbmRlZmluZWQoXCJub0VtaXRTaW5nbGVcIik7XG4gICAgY29uc3QgZW1pdEJ1bGsgPSAhY3R4LmdldE9yVW5kZWZpbmVkKFwibm9FbWl0QnVsa1wiKTtcbiAgICBpZiAoKGlzQnVsayAmJiBlbWl0QnVsaykgfHwgKCFpc0J1bGsgJiYgZW1pdFNpbmdsZSkpIHtcbiAgICAgIC8vIFBhc3MgdGhlIE1TUCBvd25lciBmcm9tIHN0dWIgYW5kIHRoZSByZXN1bHQgcGF5bG9hZCAoaWYgYW55KSBpbiB0aGVcbiAgICAgIC8vIHBvc2l0aW9ucyB0aGUgaGFuZGxlciBleHBlY3RzOiAodGFibGUsIGV2ZW50LCBpZCwgb3duZXI/LCBwYXlsb2FkPywgY3R4KVxuICAgICAgY29uc3QgbXNwSWQgPSBjdHguc3R1Yi5nZXRNc3BJRCA/IGN0eC5zdHViLmdldE1zcElEKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBub25DdHhBcmdzID0gY3R4QXJncy5zbGljZSgwLCAtMSk7IC8vIGV2ZXJ5dGhpbmcgYmVmb3JlIGN0eFxuICAgICAgY29uc3QgcGF5bG9hZCA9IG5vbkN0eEFyZ3MubGVuZ3RoID4gMCA/IG5vbkN0eEFyZ3NbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICAgIHRhYmxlLFxuICAgICAgICBldmVudCxcbiAgICAgICAgaWQsXG4gICAgICAgIG1zcElkLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBjdHhcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciB8IHN0cmluZyk6IEUge1xuICAgIC8vIGlmIChcbiAgICAvLyAgIE1JU1NJTkdfUFJJVkFURV9EQVRBX1JFR0VYLnRlc3QoXG4gICAgLy8gICAgIHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZVxuICAgIC8vICAgKVxuICAgIC8vIClcbiAgICAvLyAgIHJldHVybiBuZXcgVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MoZXJyKSBhcyBFO1xuICAgIGNvbnN0IG1zZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE5vdEZvdW5kRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25mbGljdEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQmFkUmVxdWVzdEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUXVlcnlFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBRdWVyeUVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFBhZ2luZ0Vycm9yLm5hbWUpKSByZXR1cm4gbmV3IFBhZ2luZ0Vycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFVuc3VwcG9ydGVkRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTWlncmF0aW9uRXJyb3IubmFtZSkpIHJldHVybiBuZXcgTWlncmF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoT2JzZXJ2ZXJFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBPYnNlcnZlckVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEF1dGhvcml6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEZvcmJpZGRlbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IEZvcmJpZGRlbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbm5lY3Rpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFNlcmlhbGl6YXRpb25FcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFwibm8gbGVkZ2VyIGNvbnRleHRcIikpXG4gICAgICByZXR1cm4gbmV3IE1pc3NpbmdDb250ZXh0RXJyb3IoXG4gICAgICAgIGBObyBjb250ZXh0IGZvdW5kLiB0aGlzIGNhbiBiZSBjYXVzZWQgYnkgZGVidWdnaW5nOiAke21zZ31gXG4gICAgICApIGFzIEU7XG5cbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIGZvciBkZWNvcmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMvZXh0ZW5kcyBkZWNhZiBkZWNvcmF0aW9uIHdpdGggRmFicmljLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbiAgICogQHN0YXRpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCk6IHZvaWQge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSwge30pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSwge30pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gICAgICAuZXh0ZW5kKEZhYnJpY1Byb3BlcnR5KCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoVmFsaWRhdGlvbktleXMuREFURSlcbiAgICAgIC5leHRlbmQoZnVuY3Rpb24gZmFicmljUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3A/OiBhbnkpID0+IHtcbiAgICAgICAgICBQcm9wZXJ0eShwcm9wLCBcInN0cmluZzpkYXRlXCIpKHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKVxuICAgICAgLmV4dGVuZChmdW5jdGlvbiB0YWJsZShvYmo6IGFueSkge1xuICAgICAgICBjb25zdCBjaGFpbjogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPVxuICAgICAgICAgIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBNZXRhZGF0YS5jb25zdHIob2JqKVxuICAgICAgICAgICAgOiBNZXRhZGF0YS5jb25zdHIob2JqLmNvbnN0cnVjdG9yKTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudC5wcm90b3R5cGUpIHtcbiAgICAgICAgICBjaGFpbi5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhjaGFpbi5tYXAoKGMpID0+IGMubmFtZSB8fCBjKSk7XG5cbiAgICAgICAgLy8gQXBwbHkgZnJvbSB0aGUgYmFzZSBjbGFzcyBkb3duIHRvIHRoZSBkZWNvcmF0ZWQgY2xhc3NcbiAgICAgICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGNoYWluLnBvcCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBDYWxsaW5nIG9uICR7Y29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAgICAgICBGYWJyaWNPYmplY3QoKShjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRmFicmljT2JqZWN0KCkob2JqKTtcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5GYWJyaWNDb250cmFjdEFkYXB0ZXIuZGVjb3JhdGlvbigpO1xuQWRhcHRlci5zZXRDdXJyZW50KEZhYnJpY0ZsYXZvdXIpO1xuIl19
1134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEdBR1osTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSw2QkFBMEI7QUFDMUQsT0FBTyxFQUNMLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLGNBQWMsRUFHZCxrQkFBa0IsR0FDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBRUwsTUFBTSxJQUFJLFlBQVksRUFDdEIsUUFBUSxFQUNSLFFBQVEsSUFBSSxjQUFjLEdBQzNCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxlQUFlLEVBSWYsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFJUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxlQUFlLEVBRWYsT0FBTyxFQVNQLHdCQUF3QixFQUd4QixlQUFlLEVBQ2YseUJBQXlCLEdBQzFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHNDQUFtQztBQU90RSxPQUFPLEVBQUUsZUFBZSxFQUFFLHFDQUFrQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0NBQWlDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUNBQTRCO0FBQ3BELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxxREFBZ0Q7QUFDeEYsT0FBTyxFQUNMLEtBQUss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QUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgTWFuZ29RdWVyeSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuL0NvbnRyYWN0Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEVycm9yLFxuICBCYXNlRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxuICBQcmltYXJ5S2V5VHlwZSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQgYXMgQ3R4LFxuICBPYmplY3QgYXMgRmFicmljT2JqZWN0LFxuICBQcm9wZXJ0eSxcbiAgUHJvcGVydHkgYXMgRmFicmljUHJvcGVydHksXG59IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIEFkYXB0ZXIsXG4gIEFkYXB0ZXJGbGFncyxcbiAgUHJlcGFyZWRNb2RlbCxcbiAgUmVwb3NpdG9yeSxcbiAgUXVlcnlFcnJvcixcbiAgUGFnaW5nRXJyb3IsXG4gIE1pZ3JhdGlvbkVycm9yLFxuICBPYnNlcnZlckVycm9yLFxuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIENvbnRleHR1YWxpemVkQXJncyxcbiAgQ29udGV4dCxcbiAgUmF3UmVzdWx0LFxuICBQYWdpbmF0b3IsXG4gIENvbnRleHR1YWxBcmdzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE1ldGhvZE9yT3BlcmF0aW9uLFxuICBBbGxPcGVyYXRpb25LZXlzLFxuICBGbGFnc09mLFxuICBDb250ZXh0T2YsXG4gIFRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyxcbiAgRXZlbnRJZHMsXG4gIERpc3BhdGNoLFxuICBwcm9taXNlU2VxdWVuY2UsXG4gIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVTdHViLFxuICBDbGllbnRJZGVudGl0eSxcbiAgSXRlcmF0b3JzLFxuICBTdGF0ZVF1ZXJ5UmVzcG9uc2UsXG59IGZyb20gXCJmYWJyaWMtc2hpbS1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY1N0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RTZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRmFicmljRmxhdm91ciB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplciB9IGZyb20gXCIuLi9zaGFyZWQvU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5LFxuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgTWV0YWRhdGEsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFBhZ2luYXRvciB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0UGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBNaXNzaW5nQ29udGV4dEVycm9yIH0gZnJvbSBcIi4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IFNlZ3JlZ2F0ZWRNb2RlbCB9IGZyb20gXCIuLi9zaGFyZWQvaW5kZXhcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RGlzcGF0Y2ggfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdERpc3BhdGNoXCI7XG5cbmV4cG9ydCB0eXBlIEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxcbiAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gIEVYVEVORCBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4gPSBDb250ZXh0dWFsaXplZEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTLCBFWFRFTkQ+ICYge1xuICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIG9yIHVwZGF0ZXIgZmllbGQgaW4gYSBtb2RlbCBiYXNlZCBvbiB0aGUgdXNlciBpbiB0aGUgY29udGV4dFxuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBpbiBkZWNvcmF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBjcmVhdGVkX2J5IG9yIHVwZGF0ZWRfYnkgZmllbGRzXG4gKiB3aXRoIHRoZSB1c2VybmFtZSBmcm9tIHRoZSBjb250ZXh0IHdoZW4gYSBkb2N1bWVudCBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgTmFub1JlcG9zaXRvcnk8TT5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbiBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHdpdGggdGhlIHVzZXJuYW1lXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZmFicmljLmNvbnRyYWN0c1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBGIGFzIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBGLT4+QzogZ2V0KFwidXNlclwiKVxuICogICBDLS0+PkY6IHVzZXIgb2JqZWN0XG4gKiAgIEYtPj5NOiBzZXQga2V5IHRvIHVzZXIubmFtZVxuICogICBOb3RlIG92ZXIgRjogSWYgbm8gdXNlciBpbiBjb250ZXh0XG4gKiAgIEYtLT4+RjogdGhyb3cgVW5zdXBwb3J0ZWRFcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyID0gY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBDbGllbnRJZGVudGl0eTtcbiAgICBtb2RlbFtrZXldID0gdXNlci5nZXRJRCgpIGFzIE1bdHlwZW9mIGtleV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIk5vIFVzZXIgZm91bmQgaW4gY29udGV4dC4gUGxlYXNlIHByb3ZpZGUgYSB1c2VyIGluIHRoZSBjb250ZXh0XCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgc3RhdGUgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBDb3VjaERCLWxpa2UgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2UgZnJvbSB3aXRoaW4gYSBjaGFpbmNvZGUgY29udHJhY3RcbiAqIEB0ZW1wbGF0ZSB2b2lkIC0gTm8gY29uZmlndXJhdGlvbiBuZWVkZWQgZm9yIGNvbnRyYWN0IGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNDb250cmFjdEZsYWdzIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIGNvbnRyYWN0IG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNDb250cmFjdENvbnRleHQgLSBDb250ZXh0IHR5cGUgZm9yIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAY2xhc3MgRmFicmljQ29udHJhY3RBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW4gYSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRyYWN0IGNsYXNzXG4gKiBpbXBvcnQgeyBGYWJyaWNDb250cmFjdEFkYXB0ZXIgfSBmcm9tICdAZGVjYWYtdHMvZm9yLWZhYnJpYyc7XG4gKlxuICogZXhwb3J0IGNsYXNzIE15Q29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIHByaXZhdGUgYWRhcHRlciA9IG5ldyBGYWJyaWNDb250cmFjdEFkYXB0ZXIoKTtcbiAqXG4gKiAgIEBUcmFuc2FjdGlvbigpXG4gKiAgIGFzeW5jIGNyZWF0ZUFzc2V0KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgICAgY29uc3QgbW9kZWwgPSB7IGlkLCBkYXRhLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAqICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKCdhc3NldHMnLCBpZCwgbW9kZWwsIHt9LCB7IHN0dWI6IGN0eC5zdHViIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgRmFicmljQ29udHJhY3RBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0dWJcbiAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICpcbiAqICAgQ29udHJhY3QtPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCwgdHJhbnNpZW50LCBjdHgpXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogU2VyaWFsaXplIG1vZGVsIHRvIEpTT05cbiAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+U3R1YjogcHV0U3RhdGUoaWQsIHNlcmlhbGl6ZWREYXRhKVxuICogICBTdHViLT4+U3RhdGVEQjogV3JpdGUgZGF0YVxuICogICBTdGF0ZURCLS0+PlN0dWI6IFN1Y2Nlc3NcbiAqICAgU3R1Yi0tPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IFN1Y2Nlc3NcbiAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLS0+PkNvbnRyYWN0OiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RBZGFwdGVyIGV4dGVuZHMgQ291Y2hEQkFkYXB0ZXI8XG4gIGFueSxcbiAgdm9pZCxcbiAgRmFicmljQ29udHJhY3RDb250ZXh0XG4+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENsaWVudCgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIkNsaWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIEZhYnJpYyBjb250cmFjdHNcIik7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0IGRlY29kZXIgZm9yIGNvbnZlcnRpbmcgYmluYXJ5IGRhdGEgdG8gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgc2VyaWFsaXplciA9IG5ldyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSBDb250ZXh0IGNvbnN0cnVjdG9yIHdpdGggRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IENvbnRleHQoKTogQ29uc3RydWN0b3I8RmFicmljQ29udHJhY3RDb250ZXh0PiB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgTWFuZ29RdWVyeSwgRmFicmljQ29udHJhY3RBZGFwdGVyLCBGYWJyaWNDb250cmFjdEZsYWdzLCBGYWJyaWNDb250cmFjdENvbnRleHQ+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPGFueSwgdm9pZCwgTWFuZ29RdWVyeSwgQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICBvdmVycmlkZSBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBxdWVyeTogTWFuZ29RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICk6IFBhZ2luYXRvcjxNLCBhbnksIE1hbmdvUXVlcnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NvbnRyYWN0UGFnaW5hdG9yKHRoaXMsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdFNlcXVlbmNlKG9wdGlvbnMsIHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBEaXNwYXRjaCgpOiBEaXNwYXRjaDxGYWJyaWNDb250cmFjdEFkYXB0ZXI+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NvbnRyYWN0RGlzcGF0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNDb250cmFjdEFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7dm9pZH0gc2NvcGUgLSBOb3QgdXNlZCBpbiB0aGlzIGFkYXB0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiB2b2lkLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBGYWJyaWNGbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBvdmVycmlkZSBmb3IoY29uZmlnOiBQYXJ0aWFsPGFueT4sIC4uLmFyZ3M6IGFueSk6IHR5cGVvZiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuZm9yKGNvbmZpZywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TW9kZWxEZWZhdWx0czxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IG0gPSBuZXcgY2xhenooKTtcbiAgICByZXR1cm4gKE1ldGFkYXRhLnByb3BlcnRpZXMoY2xhenopIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAoYWNjLCBwKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgbVtwIGFzIGtleW9mIE1dICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIGFjY1twIGFzIGtleW9mIE1dID0gbVtwIGFzIGtleW9mIE1dO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxrZXlvZiBNLCBhbnk+XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHJlY29yZCBpbiB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgU2VyaWFsaXplcyBhIG1vZGVsIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGFcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0cmFuc2llbnQgLSBUcmFuc2llbnQgZGF0YSAobm90IHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbilcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLCBpbmNsdWRpbmcgdGhlIGNoYWluY29kZSBzdHViIGFuZCBsb2dnZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlKTtcbiAgICB0aGlzLmVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uKGNsYXp6LCBjdHgpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIGNyZWF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVsbHlTZWdyZWdhdGVkID0gY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmICFtaXJyb3JDb2xsZWN0aW9uO1xuXG4gICAgaWYgKCFtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICBsZXQgZXhpc3Rpbmc6IGFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leC1hc3NpZ25cbiAgICAgICAgZSA9IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nKVxuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgcmVjb3JkIHdpdGggaWQgJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9IGFscmVhZHkgZXhpc3RzYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgYWRkaW5nIGVudHJ5IHRvICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7aWR9YCk7XG5cbiAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldE1vZGVsRGVmYXVsdHMoY2xhenopO1xuICAgICAgICAvLyBoYW5kbGUgcHVibGljIGRhdGEgaWYgbm90IGZ1bGx5IHNlZ3JlZ2F0ZWRcbiAgICAgICAgaWYgKCFmdWxseVNlZ3JlZ2F0ZWQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtb2RlbCkuZmlsdGVyKChrKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCS2V5cy5UQUJMRSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgICAgICBkZWZhdWx0cyAmJlxuICAgICAgICAgICAgICAgIGsgaW4gZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1trIGFzIGtleW9mIE1dID09PSBtb2RlbFtrXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSkubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBzZWdyZWdhdGVkIHdyaXRlc1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmdldEZyb21DaGlsZHJlbihcInNlZ3JlZ2F0ZWREYXRhXCIpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBpbiBkYXRhKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgICAgICAgIGRhdGFbY29sbGVjdGlvbl1baWQgYXMgYW55XSxcbiAgICAgICAgICAgICAgICBjdHhcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZUxhYmVsID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTGFiZWx9IHRhYmxlYCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy5jcmVhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmN0eEFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgZGVzZXJpYWxpemVzIGEgcmVjb3JkIGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWQpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIHJlYWQgd2l0aCBhcmdzICR7YXJnc31gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNNaXJyb3IgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JcIikgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNNaXJyb3IgJiYgbWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5yZWFkU3RhdGUoXG4gICAgICAgICAgY29tcG9zZWRLZXksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgICAgIGN0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIHRyeSB7XG4gICAgICBtb2RlbCA9IGN0eC5pc0Z1bGx5U2VncmVnYXRlZFxuICAgICAgICA/IHt9XG4gICAgICAgIDogYXdhaXQgdGhpcy5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRDb2xsZWN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAuLi4oY3R4LmdldFJlYWRDb2xsZWN0aW9ucygpIHx8IFtdKSxcbiAgICAgIC4uLihjdHguY29uc3VtZVJlYWRDb2xsZWN0aW9ucygpIHx8IFtdKSxcbiAgICBdKTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiByZWFkQ29sbGVjdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obW9kZWwsIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2wpLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KSk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgaWYgKHBhcnNlZCBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIGNvbnRpbnVlO1xuICAgICAgICB0aHJvdyBwYXJzZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghT2JqZWN0LmtleXMobW9kZWwpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGByZWNvcmQgd2l0aCBpZCAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX0gZG9lcyBub3QgZXhpc3RgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuZGVidWcoYFJlYWRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgYnJlYWtPblNpbmdsZUZhaWx1cmUgPSBjdHguZ2V0KFwiYnJlYWtPblNpbmdsZUZhaWx1cmVJbkJ1bGtcIikgPz8gdHJ1ZTtcbiAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSAhYnJlYWtPblNpbmdsZUZhaWx1cmU7XG5cbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWFkTWlycm9yID0gYXN5bmMgPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCFtaXJyb3JDb2xsZWN0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEVycm9yKFwiTWlzc2luZyBtaXJyb3IgY29sbGVjdGlvbiBmb3IgbWlycm9yIHJlYWRcIik7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCByZWFkTWlycm9yKTtcbiAgICAgICAgbG9nLmluZm8oYGluIEFEQVBURVIgcmVhZCB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1xuICAgICAgICAgIFN0cmluZyhpZCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucmVhZFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXNrcyA9IGlkLm1hcChcbiAgICAgICAgKGkpID0+ICgpID0+XG4gICAgICAgICAgaXNNaXJyb3IgJiYgbWlycm9yQ29sbGVjdGlvblxuICAgICAgICAgICAgPyByZWFkTWlycm9yKFxuICAgICAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgICAgICBjdHgub3ZlcnJpZGUoeyBub0VtaXRTaW5nbGU6IHRydWUgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnJlYWQoY2xhenosIGksIC4uLmFyZ3MsIGN0eC5vdmVycmlkZSh7IG5vRW1pdFNpbmdsZTogdHJ1ZSB9KSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IGNvbnRpbnVlT25FcnJvclxuICAgICAgICA/IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcywgdHJ1ZSlcbiAgICAgICAgOiBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MpO1xuICAgICAgcmV0dXJuIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQoXG4gICAgICAgIHJhd1Jlc3VsdCxcbiAgICAgICAgY29udGludWVPbkVycm9yLFxuICAgICAgICBsb2csXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgdXBkYXRlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG5cbiAgICB0aGlzLmVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uKGNsYXp6LCBjdHgpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIHVwZGF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYHVwZGF0aW5nIGVudHJ5IGluICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7aWR9YCk7XG5cbiAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldE1vZGVsRGVmYXVsdHMoY2xhenopO1xuICAgICAgICAvLyBoYW5kbGUgcHVibGljIGRhdGFcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5rZXlzKG1vZGVsKS5maWx0ZXIoKGspID0+IHtcbiAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCS2V5cy5UQUJMRSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgIGsgaW4gZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgZGVmYXVsdHNbayBhcyBrZXlvZiBNXSA9PT0gbW9kZWxba11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkubGVuZ3RoXG4gICAgICAgIClcbiAgICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucHV0U3RhdGUoY29tcG9zZWRLZXksIG1vZGVsLCBjdHgpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBzZWdyZWdhdGVkIHdyaXRlc1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmdldEZyb21DaGlsZHJlbihcInNlZ3JlZ2F0ZWREYXRhXCIpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBpbiBkYXRhKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgICAgICAgIGRhdGFbY29sbGVjdGlvbl1baWQgYXMgYW55XSxcbiAgICAgICAgICAgICAgICBjdHhcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlY29yZCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuXG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgaWYgKG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnJlYWRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gY3R4LmlzRnVsbHlTZWdyZWdhdGVkXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgICAgIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyBlbnRyeSAke2NvbXBvc2VkS2V5fSBmcm9tIHB1YmxpYyBsZWRnZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBjdHguZ2V0UmVhZENvbGxlY3Rpb25zKCk7XG4gICAgICBpZiAoY29sbGVjdGlvbnMgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgYGVuc3VyaW5nIGNvbGxlY3Rpb24gJHtjb2x9IGhhcyBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX0gYmVmb3JlIGRlbGV0aW5nYFxuICAgICAgICAgICk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbCkucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgRGVsZXRpbmcgcHJpdmF0ZSBjb2xsZWN0aW9uICR7Y29sfSBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sKS5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlU3RhdGUoaWQ6IHN0cmluZywgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgYXdhaXQgY29udGV4dC5zdHViLmRlbGV0ZVN0YXRlKGlkKTtcbiAgfVxuXG4gIGZvclByaXZhdGUoY29sbGVjdGlvbjogc3RyaW5nKTogRmFicmljQ29udHJhY3RBZGFwdGVyIHtcbiAgICBjb25zdCB0b092ZXJyaWRlID0gW1xuICAgICAgdGhpcy5wdXRTdGF0ZSxcbiAgICAgIHRoaXMucmVhZFN0YXRlLFxuICAgICAgdGhpcy5kZWxldGVTdGF0ZSxcbiAgICAgIHRoaXMucXVlcnlSZXN1bHQsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkLFxuICAgIF0ubWFwKChmbikgPT4gZm4ubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAoIXRvT3ZlcnJpZGUuaW5jbHVkZXMocHJvcCBhcyBzdHJpbmcpKVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSgodGFyZ2V0IGFzIGFueSlbcHJvcF0sIHtcbiAgICAgICAgICBhc3luYyBhcHBseShmbiwgdGhpc0FyZywgYXJnc0xpc3QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgICAgICAgICBjYXNlIFwicHV0U3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIC8vIHB1dFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dClcbiAgICAgICAgICAgICAgICBjb25zdCBbaWQsIG1vZGVsLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgd3JpdGUgdG8gJHtjb2xsZWN0aW9ufSBmb3IgJHtpZC50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwgYXMgTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5wdXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVTdGF0ZSBzaWduYXR1cmU6IChpZDogc3RyaW5nLCBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICAgICAgICAgICAgY29uc3QgW2lkLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgZGVsZXRlIG9uICR7Y29sbGVjdGlvbn0gZm9yICR7aWQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5kZWxldGVQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInJlYWRTdGF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgLy8gcmVhZFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KVxuICAgICAgICAgICAgICAgIGNvbnN0IFtpZCwgY3R4XSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHByb3ApO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBQcml2YXRlIHJlYWQgZnJvbSAke2NvbGxlY3Rpb259IGZvciAke2lkLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGN0eC5zdHViLmdldFByaXZhdGVEYXRhKGNvbGxlY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudG9TdHJpbmcoKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCAuLi5hcmdzXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKGFyZ3MsIHByb3ApO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBRdWVyeWluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gZm9yICR7SlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgICAgICBgaXRlcmF0b3IgZnJvbSBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5pdGVyYXRvciB8fCByZXM7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFBhZ2luYXRlZFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCBsaW1pdCwgLCBib29rbWFyaywgLi4uYXJnc10gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvZyB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShhcmdzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IE1hdGgubWF4KDEsIE51bWJlcihsaW1pdCkgfHwgMjUwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4ucmF3SW5wdXQgfTtcbiAgICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBxdWVyeSBDb3VjaERCLWNvbXBhdGlibGUgYW5kIGxldCBGYWJyaWMvQ291Y2hEQiBvd24gYm9va21hcmsgc2VtYW50aWNzLlxuICAgICAgICAgICAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFnZVNpemU7XG4gICAgICAgICAgICAgICAgaWYgKGJvb2ttYXJrICE9PSB1bmRlZmluZWQgJiYgYm9va21hcmsgIT09IG51bGwgJiYgYm9va21hcmsgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5LmJvb2ttYXJrID0gYm9va21hcmsudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXJ5LmJvb2ttYXJrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICBgUXVlcnlpbmcgY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IGZvciAke0pTT04uc3RyaW5naWZ5KHF1ZXJ5KX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IChcbiAgICAgICAgICAgICAgICAgIHN0dWIgYXMgQ2hhaW5jb2RlU3R1YlxuICAgICAgICAgICAgICAgICkuZ2V0UHJpdmF0ZURhdGFRdWVyeVJlc3VsdChjb2xsZWN0aW9uLCBKU09OLnN0cmluZ2lmeShxdWVyeSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID1cbiAgICAgICAgICAgICAgICAgICgocmVzcG9uc2UgYXMgYW55KS5pdGVyYXRvciB8fCByZXNwb25zZSkgYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcjtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZU1ldGFkYXRhID0gKHJlc3BvbnNlIGFzIGFueSkubWV0YWRhdGEgfHwge307XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb29rbWFyayA9XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzcG9uc2VNZXRhZGF0YS5ib29rbWFyayA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlc3BvbnNlTWV0YWRhdGEuYm9va21hcmtcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgICAgICAgICAgbG9nLnZlcmJvc2UoYGl0ZXJhdG9yIGZyb20gY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IHJlY2VpdmVkYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWQ6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBCdWZmZXIgfT4gPSBbXTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZG9uZSkgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSByZXMudmFsdWUua2V5IGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZWQubGVuZ3RoIDwgcGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBCdWZmZXIuaXNCdWZmZXIocmVzLnZhbHVlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzLnZhbHVlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy52YWx1ZS52YWx1ZSBhcyBhbnkpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZWFybHkgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIHBhZ2UgaW4gYW4gYXN5bmMgaXRlcmF0b3IgZm9yIHJlc3VsdEl0ZXJhdG9yKClcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IHBhZ2VkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBwYWdlZFtpZHgrK10sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCBhcyBhbnksIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhc3luYyBjbG9zZSgpIHt9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgaXRlcmF0b3I6XG4gICAgICAgICAgICAgICAgICAgIGFycmF5SXRlcmF0b3IgYXMgdW5rbm93biBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZFJlY29yZHNDb3VudDogcGFnZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBib29rbWFyazogcmVzcG9uc2VCb29rbWFyayxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG1ldGhvZCBvdmVycmlkZSAke1N0cmluZyhwcm9wKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcHV0U3RhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICApIHtcbiAgICBsZXQgZGF0YTogQnVmZmVyO1xuXG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgRmFicmljQ29udHJhY3RBZGFwdGVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsIGFzIE1vZGVsLCBmYWxzZSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgcmVjb3JkIHdpdGggaWQgJHtpZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBjdHguc3R1Yi5wdXRTdGF0ZShpZC50b1N0cmluZygpLCBkYXRhKTtcblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWFkU3RhdGUoaWQ6IHN0cmluZywgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG5cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMucmVhZFN0YXRlKTtcbiAgICBjb25zdCByZXMgPSAoYXdhaXQgY3R4LnN0dWIuZ2V0U3RhdGUoaWQudG9TdHJpbmcoKSkpLnRvU3RyaW5nKCk7XG4gICAgaWYgKCFyZXMpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICBsb2cuc2lsbHkoYHN0YXRlIHJldHJpZXZlZCB1bmRlciBpZCAke2lkfWApO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXMudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHBhcnNlIHJlY29yZDogJHtlfWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlSZXN1bHQoXG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YixcbiAgICByYXdJbnB1dDogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4ge1xuICAgIHJldHVybiBzdHViLmdldFF1ZXJ5UmVzdWx0KEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlSZXN1bHRQYWdpbmF0ZWQoXG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YixcbiAgICByYXdJbnB1dDogYW55LFxuICAgIGxpbWl0OiBudW1iZXIgPSAyNTAsXG4gICAgcGFnZT86IG51bWJlcixcbiAgICBib29rbWFyaz86IHN0cmluZyB8IG51bWJlcixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4+IHtcbiAgICByZXR1cm4gc3R1Yi5nZXRRdWVyeVJlc3VsdFdpdGhQYWdpbmF0aW9uKFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLFxuICAgICAgbGltaXQsXG4gICAgICBib29rbWFyaz8udG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYmluYXJ5IGRhdGEgdG8gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZmZlciAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvZGUoYnVmZmVyOiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0QWRhcHRlci50ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvcGVyYXRpb24gZmxhZ3MgZm9yIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IE1lcmdlcyBkZWZhdWx0IGZsYWdzIHdpdGggRmFicmljLXNwZWNpZmljIGNvbnRleHQgaW5mb3JtYXRpb25cbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGYWJyaWNDb250cmFjdEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHNcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHJldHVybiB7RmFicmljQ29udHJhY3RGbGFnc30gVGhlIG1lcmdlZCBmbGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDb250cmFjdEZsYWdzPiB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB8IEN0eCB8IGFueVxuICApOiBQcm9taXNlPEZhYnJpY0NvbnRyYWN0RmxhZ3M+IHtcbiAgICBsZXQgYmFzZUZsYWdzID0ge1xuICAgICAgc2VncmVnYXRlZDogZmFsc2UsXG4gICAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gICAgICBmdWxseVNlZ3JlZ2F0ZWQ6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGZsYWdzIGluc3RhbmNlb2YgRmFicmljQ29udHJhY3RDb250ZXh0IHx8IGZsYWdzIGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgZmxhZ3MgPSBmbGFncy50b092ZXJyaWRlcygpO1xuICAgIH1cblxuICAgIGJhc2VGbGFncyA9IE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCBmbGFncyk7XG4gICAgY29uc3Qgc3R1YkZyb21GbGFncyA9XG4gICAgICAoZmxhZ3MgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5zdHViIHx8IChmbGFncyBhcyBDdHgpLnN0dWI7XG4gICAgY29uc3QgaWRlbnRpdHlGcm9tRmxhZ3MgPVxuICAgICAgKGZsYWdzIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkuaWRlbnRpdHkgfHxcbiAgICAgIChmbGFncyBhcyBDdHgpLmNsaWVudElkZW50aXR5O1xuICAgIGlmIChzdHViRnJvbUZsYWdzICYmIGlkZW50aXR5RnJvbUZsYWdzKSB7XG4gICAgICBjb25zdCB0eElkID0gc3R1YkZyb21GbGFncy5nZXRUeElEKCk7XG4gICAgICBPYmplY3QuYXNzaWduKGJhc2VGbGFncywge1xuICAgICAgICBzdHViOiBzdHViRnJvbUZsYWdzLFxuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlGcm9tRmxhZ3MsXG4gICAgICAgIGNlcnQ6IGlkZW50aXR5RnJvbUZsYWdzLmdldElEQnl0ZXMoKS50b1N0cmluZygpLFxuICAgICAgICByb2xlczogaWRlbnRpdHlGcm9tRmxhZ3MuZ2V0QXR0cmlidXRlVmFsdWUoXCJyb2xlc1wiKSxcbiAgICAgICAgbG9nZ2VyOiBMb2dnaW5nLmZvcihcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbG9nTGV2ZWw6IGZhbHNlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBmYWxzZSxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR4SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmbGFnc1xuICAgICAgICApLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiB0eElkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2VGbGFncyA9IE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCBmbGFncyB8fCB7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCBzdXBlci5mbGFncyhcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIG1vZGVsLFxuICAgICAgYmFzZUZsYWdzIGFzIGFueVxuICAgICkpIGFzIEZhYnJpY0NvbnRyYWN0RmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIGZvciBGYWJyaWMgY29udHJhY3RzIGFuZCByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZVxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGluZGV4PE0+KG1vZGVsczogQ29uc3RydWN0b3I8TT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyByZXN1bHRzIGZyb20gYSBzdGF0ZSBxdWVyeSBpdGVyYXRvclxuICAgKiBAc3VtbWFyeSBJdGVyYXRlcyB0aHJvdWdoIHF1ZXJ5IHJlc3VsdHMgYW5kIGNvbnZlcnRzIHRoZW0gdG8gYSBzdHJ1Y3R1cmVkIGZvcm1hdFxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gbG9nIC0gTG9nZ2VyIGluc3RhbmNlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHBhcmFtIHtJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yfSBpdGVyYXRvciAtIFRoZSBzdGF0ZSBxdWVyeSBpdGVyYXRvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0hpc3Rvcnk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIGlzIGEgaGlzdG9yeSBxdWVyeVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gYXJyYXkgb2YgcHJvY2Vzc2VkIHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmVzdWx0SXRlcmF0b3JcbiAgICogICBwYXJ0aWNpcGFudCBJdGVyYXRvclxuICAgKlxuICAgKiAgIENhbGxlci0+PlJlc3VsdEl0ZXJhdG9yOiByZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yLCBpc0hpc3RvcnkpXG4gICAqICAgbG9vcCBVbnRpbCBkb25lXG4gICAqICAgICBSZXN1bHRJdGVyYXRvci0+Pkl0ZXJhdG9yOiBuZXh0KClcbiAgICogICAgIEl0ZXJhdG9yLS0+PlJlc3VsdEl0ZXJhdG9yOiB7IHZhbHVlLCBkb25lIH1cbiAgICogICAgIGFsdCBIYXMgdmFsdWVcbiAgICogICAgICAgUmVzdWx0SXRlcmF0b3ItPj5SZXN1bHRJdGVyYXRvcjogUHJvY2VzcyB2YWx1ZSBiYXNlZCBvbiBpc0hpc3RvcnlcbiAgICogICAgICAgUmVzdWx0SXRlcmF0b3ItPj5SZXN1bHRJdGVyYXRvcjogQWRkIHRvIHJlc3VsdHMgYXJyYXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIFJlc3VsdEl0ZXJhdG9yLT4+SXRlcmF0b3I6IGNsb3NlKClcbiAgICogICBSZXN1bHRJdGVyYXRvci0tPj5DYWxsZXI6IGFsbFJlc3VsdHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZXN1bHRJdGVyYXRvcihcbiAgICBsb2c6IExvZ2dlcixcbiAgICBpdGVyYXRvcjogSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICBpc0hpc3RvcnkgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCBhbGxSZXN1bHRzID0gW107XG4gICAgbGV0IHJlczogeyB2YWx1ZTogYW55OyBkb25lOiBib29sZWFuIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgd2hpbGUgKCFyZXMuZG9uZSkge1xuICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBsZXQganNvblJlczogYW55ID0ge307XG4gICAgICAgIGxvZy5kZWJ1ZyhyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgaWYgKGlzSGlzdG9yeSAvKiAmJiBpc0hpc3RvcnkgPT09IHRydWUqLykge1xuICAgICAgICAgIGpzb25SZXMuVHhJZCA9IHJlcy52YWx1ZS50eElkO1xuICAgICAgICAgIGpzb25SZXMuVGltZXN0YW1wID0gcmVzLnZhbHVlLnRpbWVzdGFtcDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAganNvblJlcy5WYWx1ZSA9IEpTT04ucGFyc2UocmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAganNvblJlcy5WYWx1ZSA9IHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uUmVzID0gSlNPTi5wYXJzZShyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICBqc29uUmVzID0gcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWxsUmVzdWx0cy5wdXNoKGpzb25SZXMpO1xuICAgICAgfVxuICAgICAgcmVzID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYENsb3NpbmcgaXRlcmF0b3IgYWZ0ZXIgJHthbGxSZXN1bHRzLmxlbmd0aH0gcmVzdWx0c2ApO1xuICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgcmV0dXJuIGFsbFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgcmljaCBxdWVyeSB1c2luZyBDb3VjaERCIHN5bnRheCBhZ2FpbnN0IHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9jc09ubHkgLSBXaGV0aGVyIHRvIHJldHVybiBvbmx5IGRvY3VtZW50cyAobm90IHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbilcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLCBpbmNsdWRpbmcgdGhlIGNoYWluY29kZSBzdHViIGFuZCBsb2dnZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQ29udHJhY3RBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3R1YlxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgZG9jc09ubHksIGN0eClcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IEV4dHJhY3QgbGltaXQgYW5kIHNraXBcbiAgICogICBhbHQgV2l0aCBwYWdpbmF0aW9uXG4gICAqICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBnZXRRdWVyeVJlc3VsdFdpdGhQYWdpbmF0aW9uKHF1ZXJ5LCBsaW1pdCwgc2tpcClcbiAgICogICBlbHNlIFdpdGhvdXQgcGFnaW5hdGlvblxuICAgKiAgICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+U3R1YjogZ2V0UXVlcnlSZXN1bHQocXVlcnkpXG4gICAqICAgZW5kXG4gICAqICAgU3R1Yi0+PlN0YXRlREI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBTdGF0ZURCLS0+PlN0dWI6IEl0ZXJhdG9yXG4gICAqICAgU3R1Yi0tPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IEl0ZXJhdG9yXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiByZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yKVxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdHNcbiAgICovXG4gIGFzeW5jIHJhdzxSLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJhd1Jlc3VsdDxSLCBEPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcblxuICAgIGNvbnN0IGVuYWJsZVNlZ3JlZ2F0ZXMgPSAhYXJncy5sZW5ndGggfHwgYXJnc1swXSAhPT0gdHJ1ZTtcbiAgICBjb25zdCBmdWxseVNlZ3JlZ2F0ZWQgPSBlbmFibGVTZWdyZWdhdGVzICYmIGN0eC5pc0Z1bGx5U2VncmVnYXRlZDtcblxuICAgIGNvbnN0IHsgc2tpcCwgbGltaXQgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGJvb2ttYXJrID0gcmF3SW5wdXRbXCJib29rbWFya1wiXTtcbiAgICBsZXQgcmVzcCA9IHsgZG9jczogW10sIGJvb2ttYXJrOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgICAvLyBRdWVyeSBwdWJsaWMgc3RhdGUgb25seSB3aGVuIHRoZSBtb2RlbCBpcyBOT1QgZnVsbHkgc2VncmVnYXRlZFxuICAgIGlmICghZnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICBsZXQgaXRlcmF0b3I6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgICBpZiAobGltaXQgfHwgc2tpcCkge1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJsaW1pdFwiXTtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBSZXRyaWV2aW5nIHB1YmxpYyBwYWdpbmF0ZWQgaXRlcmF0b3I6IGxpbWl0OiAke2xpbWl0fS8gc2tpcDogJHtza2lwfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMucXVlcnlSZXN1bHRQYWdpbmF0ZWQoXG4gICAgICAgICAgICBjdHguc3R1YixcbiAgICAgICAgICAgIHJhd0lucHV0LFxuICAgICAgICAgICAgbGltaXQgfHwgTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIChza2lwIGFzIGFueSk/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBib29rbWFyayxcbiAgICAgICAgICAgIC4uLltjdHggYXMgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICAgICAgICAgICkpIGFzIFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPjtcbiAgICAgICAgcmVzcC5ib29rbWFyayA9IHJlc3BvbnNlLm1ldGFkYXRhLmJvb2ttYXJrO1xuICAgICAgICBpdGVyYXRvciA9IHJlc3BvbnNlLml0ZXJhdG9yO1xuICAgICAgICBsb2cuZGVidWcoYFJldHJpZXZlZCBwdWJsaWMgcGFnaW5nIGl0ZXJhdG9yYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoXCJSZXRyaWV2aW5nIGxpc3RpbmcgcHVibGljIGl0ZXJhdG9yXCIpO1xuICAgICAgICBpdGVyYXRvciA9IChhd2FpdCB0aGlzLnF1ZXJ5UmVzdWx0KFxuICAgICAgICAgIGN0eC5zdHViLFxuICAgICAgICAgIHJhd0lucHV0LFxuICAgICAgICAgIGN0eFxuICAgICAgICApKSBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgcHVibGljIGxpc3RpbmcgaXRlcmF0b3JgKTtcblxuICAgICAgcmVzcC5kb2NzID0gKGF3YWl0IHRoaXMucmVzdWx0SXRlcmF0b3IobG9nLCBpdGVyYXRvcikpIGFzIGFueTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHJldHVybmluZyAke0FycmF5LmlzQXJyYXkocmVzcC5kb2NzKSA/IHJlc3AuZG9jcy5sZW5ndGggOiAxfSByZXN1bHRzYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzLCBzdHJpcCBwYWdpbmF0aW9uIGZpZWxkcyBmcm9tIHJhd0lucHV0XG4gICAgICAvLyBzbyB0aGUgc2VncmVnYXRlZCBxdWVyeSBiZWxvdyBjYW4gcmUtYXBwbHkgdGhlbSBjbGVhbmx5XG4gICAgICBpZiAobGltaXQgfHwgc2tpcCkge1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJsaW1pdFwiXTtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhcIlNraXBwaW5nIHB1YmxpYyBzdGF0ZSBxdWVyeSAoZnVsbHkgc2VncmVnYXRlZCBtb2RlbClcIik7XG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbnMgPSBlbmFibGVTZWdyZWdhdGVzID8gY3R4LmdldFJlYWRDb2xsZWN0aW9ucygpIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGNvbGxlY3Rpb25zICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgLy8gQnVpbGQgYSBmcmVzaCBpbnB1dCB3aXRoIGxpbWl0L3NraXAvYm9va21hcmsgcmVzdG9yZWRcbiAgICAgIGNvbnN0IHNlZ3JlZ2F0ZWRJbnB1dCA9IHsgLi4ucmF3SW5wdXQgfTtcbiAgICAgIGlmIChsaW1pdCkgc2VncmVnYXRlZElucHV0LmxpbWl0ID0gbGltaXQ7XG4gICAgICBpZiAoc2tpcCkgc2VncmVnYXRlZElucHV0LnNraXAgPSBza2lwO1xuICAgICAgaWYgKGJvb2ttYXJrKSBzZWdyZWdhdGVkSW5wdXRbXCJib29rbWFya1wiXSA9IGJvb2ttYXJrO1xuXG4gICAgICBjb25zdCBzZWdyZWdhdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUXVlcnlpbmcgZnJvbSAke2NvbGxlY3Rpb259YCk7XG4gICAgICAgIGNvbnN0IGZyb21Db2xzID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnJhdyhcbiAgICAgICAgICB7IC4uLnNlZ3JlZ2F0ZWRJbnB1dCB9LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgICApO1xuICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICBgcmVjZWl2ZWQgJHsoZnJvbUNvbHMgYXMgdW5rbm93biBhcyBhbnlbXSkubGVuZ3RofSBmcm9tICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICAgIHNlZ3JlZ2F0ZWQucHVzaChmcm9tQ29scyk7XG4gICAgICB9XG4gICAgICAvLyBjaG9vc2UgdGhlIHJlc3BvbnNlIHdpdGggdGhlIG1vc3QgcmVzdWx0c1xuICAgICAgcmVzcCA9IHNlZ3JlZ2F0ZWQucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgaWYgKCFhY2MpIHJldHVybiBjdXJyO1xuICAgICAgICBpZiAoY3Vyci5kb2NzICYmIGN1cnIuZG9jcy5sZW5ndGggPj0gYWNjPy5kb2NzLmxlbmd0aCkgcmV0dXJuIGN1cnI7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCByZXNwKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jc09ubHkpIHtcbiAgICAgIHJldHVybiByZXNwLmRvY3MgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcCBhcyBhbnk7XG4gIH1cblxuICBhc3luYyB2aWV3PFI+KFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLl9hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkZhYnJpYyBjb250cmFjdHMgZG8gbm90IHN1cHBvcnQgQ291Y2hEQiB2aWV3cy5cIlxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogRmFicmljU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljU3RhdGVtZW50KHRoaXMgYXMgYW55LCBvdmVycmlkZXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZUxhYmVsID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgbG9nLmRlYnVnKGBVcGRhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTGFiZWx9IHRhYmxlYCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy51cGRhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmN0eEFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa1xuICAgKiBAcGFyYW0gYXJnc1xuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJlcGFyZWRNb2RlbCAmIHtcbiAgICBzZWdyZWdhdGVkPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj47XG4gIH0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGsgYXMga2V5b2YgTV07XG5cbiAgICBjb25zdCBpc01pcnJvciA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvclwiKSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbWFwVG9SZWNvcmQgPSBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNDb250cmFjdEFkYXB0ZXIsXG4gICAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBrZXlzT3ZlcnJpZGU/OiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgaWYgKGtleXNPdmVycmlkZSlcbiAgICAgICAga2V5c092ZXJyaWRlID0gWy4uLm5ldyBTZXQoWy4uLmtleXNPdmVycmlkZSwgcGsgYXMgc3RyaW5nXSldO1xuICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgICAgaWYgKGtleXNPdmVycmlkZSAmJiAha2V5c092ZXJyaWRlLmluY2x1ZGVzKGtleSkpIHJldHVybiBhY2N1bTtcbiAgICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gTW9kZWwuY29sdW1uTmFtZShtb2RlbCwga2V5IGFzIGFueSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgICB2YWwgPSB2YWwgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUodmFsKSA6IHZhbDtcbiAgICAgICAgICBhY2N1bVttYXBwZWRQcm9wXSA9IHZhbDtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkuZmlsdGVyKChrKSA9PiBCb29sZWFuKHJlc3VsdFtrXSkpLmxlbmd0aCkge1xuICAgICAgICAvLyBBZGQgdGFibGUgaWRlbnRpZmllclxuICAgICAgICByZXN1bHRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBsb2cuc2lsbHkoXG4gICAgICBgUHJlcGFyaW5nIHJlY29yZCBmb3IgJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHsobW9kZWwgYXMgYW55KVtwa119YFxuICAgICk7XG5cbiAgICBjb25zdCBzZWdyZWdhdGVkV3JpdGVLZXlzID0gY3R4LmdldFNlZ3JlZ2F0ZWRXcml0ZXMoKTtcbiAgICBjb25zdCBzZWdyZWdhdGVkV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgLy8gT25seSBhcHBseSBzZWdyZWdhdGVkIHdyaXRlcyB3aGVuIHRoZSBjdXJyZW50IG1vZGVsIGFjdHVhbGx5IGhhcyBhIHRyYW5zaWVudCBzcGxpdC5cbiAgICAvLyBUaGUgc2FtZSBGYWJyaWNDb250cmFjdENvbnRleHQgY2FuIGJlIHJldXNlZCBhY3Jvc3MgbmVzdGVkIG9wZXJhdGlvbnMgKGZvciBleGFtcGxlXG4gICAgLy8gc2VxdWVuY2UgdXBzZXJ0cyBkdXJpbmcgcGVyc2lzdGVudCB2ZXJzaW9uIGdlbmVyYXRpb24pLiBJbiB0aG9zZSBjYXNlcywgd2UgbXVzdCBub3RcbiAgICAvLyBhdHRlbXB0IHRvIGFwcGx5IHBhcmVudC1tb2RlbCBzZWdyZWdhdGVkIHdyaXRlIGtleXMgdG8gdW5yZWxhdGVkIG1vZGVscy5cbiAgICBpZiAoc2VncmVnYXRlZFdyaXRlS2V5cyAmJiBzcGxpdC50cmFuc2llbnQgJiYgdHlwZW9mIHNwbGl0LnRyYW5zaWVudCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIGluIHNlZ3JlZ2F0ZWRXcml0ZUtleXMpIHtcbiAgICAgICAgc2VncmVnYXRlZFdyaXRlc1tjb2xsZWN0aW9uXSA9IHNlZ3JlZ2F0ZWRXcml0ZXNbY29sbGVjdGlvbl0gfHwge307XG4gICAgICAgIHNlZ3JlZ2F0ZWRXcml0ZXNbY29sbGVjdGlvbl1baWQgYXMgYW55XSA9IG1hcFRvUmVjb3JkKFxuICAgICAgICAgIGN0eC5nZXRPclVuZGVmaW5lZChcImZvcmNlU2VncmVnYXRlV3JpdGVcIilcbiAgICAgICAgICAgID8gc3BsaXQubW9kZWxcbiAgICAgICAgICAgIDogKChzcGxpdC50cmFuc2llbnQgYXMgYW55KSB8fCB7fSksXG4gICAgICAgICAgc2VncmVnYXRlZFdyaXRlS2V5c1tjb2xsZWN0aW9uXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIG1pcnJvciBtb2RlLCB0aGUgcmVjb3JkIHNob3VsZCBjb250YWluIEFMTCBtb2RlbCBwcm9wZXJ0aWVzIChmdWxsIGNvcHkpXG4gICAgY29uc3QgcmVjb3JkID0gaXNNaXJyb3IgPyBtYXBUb1JlY29yZChtb2RlbCkgOiBtYXBUb1JlY29yZChzcGxpdC5tb2RlbCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkLFxuICAgICAgaWQ6IChtb2RlbCBhcyBhbnkpW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6XG4gICAgICAgICFpc01pcnJvciAmJiBzcGxpdC50cmFuc2llbnQgJiYgT2JqZWN0LmtleXMoc3BsaXQudHJhbnNpZW50KS5sZW5ndGhcbiAgICAgICAgICA/IG1hcFRvUmVjb3JkKHNwbGl0LnRyYW5zaWVudClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHNlZ3JlZ2F0ZWQ6IGlzTWlycm9yID8gdW5kZWZpbmVkIDogc2VncmVnYXRlZFdyaXRlcyxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBjb25zdCBvYjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IHBrUHJvcHMgPSBNb2RlbC5wa1Byb3BzKGNsYXp6KTtcbiAgICBpZiAocGtQcm9wcz8udHlwZSA9PT0gTnVtYmVyICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWQgPSBOdW1iZXIoaWQpO1xuICAgIH1cbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7Y2xhenoubmFtZX0gaWQgJHtpZH1gKTtcblxuICAgIGZ1bmN0aW9uIG1hcFRvTW9kZWwocjogUmVjb3JkPGFueSwgYW55Pikge1xuICAgICAgY29uc3QgbSA9IChcbiAgICAgICAgdHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gTW9kZWwuYnVpbGQob2IsIGNsYXp6KSA6IG5ldyBjbGF6eihvYilcbiAgICAgICkgYXMgTTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBNb2RlbC5nZXRBdHRyaWJ1dGVzKGNsYXp6KTtcbiAgICAgIGNvbnN0IGtleXMgPSBhdHRyaWJ1dGVzLmxlbmd0aCA/IGF0dHJpYnV0ZXMgOiBPYmplY3Qua2V5cyhtKTtcbiAgICAgIHJldHVybiBrZXlzXG4gICAgICAgIC5maWx0ZXIoKGspID0+IGsgIT09IChwayBhcyBzdHJpbmcpKVxuICAgICAgICAucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPVxuICAgICAgICAgICAgcltNb2RlbC5jb2x1bW5OYW1lKGFjY3VtLCBrZXkgYXMgYW55KV07XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCBtKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gbWFwVG9Nb2RlbChvYmopO1xuXG4gICAgaWYgKHRyYW5zaWVudCAmJiAhdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChjdHgpKSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBmaWx0ZXJpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChhY2MsIFtrZXksIHZdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IHBrIHx8ICEoa2V5IGluIHRyYW5zaWVudCkpIHtcbiAgICAgICAgICBhY2Nba2V5IGFzIGtleW9mIE1dID0gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IGNsYXp6KCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvcGVyYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5tYXAoKGspID0+IGsudG9Mb3dlckNhc2UoKSkuaW5jbHVkZXMob3ApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0TXNwKGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCBDbGllbnRJZGVudGl0eVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGlkZW50aXR5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaWRlbnRpdHk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBpZGVudGl0eS5nZXRNU1BJRCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KGNsYXp6KTtcbiAgICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgICBjb25zdCBtc3AgPSB0aGlzLmdldENvbnRleHRNc3AoY3R4KTtcbiAgICBpZiAoIW1zcCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIG1zcCA9PT0gbWlycm9yTWV0YS5tc3BJZCB8fFxuICAgICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBgT3JnYW5pemF0aW9uICR7bXNwfSBpcyBub3QgYXV0aG9yaXplZCB0byBtb2RpZnkgbWlycm9yZWQgZGF0YWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG5cbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc10gYXMgW1xuICAgICAgQ29uc3RydWN0b3I8TT4sXG4gICAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICAuLi5hbnlbXSxcbiAgICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdIGFzIFtcbiAgICAgIENvbnN0cnVjdG9yPE0+LFxuICAgICAgUHJpbWFyeUtleVR5cGUsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgLi4uYW55W10sXG4gICAgICBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICk6IChzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcltdIHwgUmVjb3JkPHN0cmluZywgYW55PltdKVtdIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRzLCByZWNvcmRzLCBjdHggYXMgYW55XTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICkge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuXG4gICAgY29uc3QgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQgPSBhcmdzLnBvcCgpO1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZHMsIHJlY29yZHMsIGN0eCBhcyBhbnldO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZ1xuICApOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLnBhcnNlRXJyb3IocmVhc29uIHx8IGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0RcbiAgKTogRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT47XG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogZmFsc2VcbiAgKTogRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT47XG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogdHJ1ZSxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8RmFicmljQ29udHJhY3RDb250ZXh0Pj5cbiAgKTogUHJvbWlzZTxcbiAgICBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPlxuICA+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8RmFicmljQ29udHJhY3RDb250ZXh0Pj4gfCBDdHhcbiAgKTpcbiAgICB8IFByb21pc2U8XG4gICAgICAgIEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+XG4gICAgICA+XG4gICAgfCBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPiB7XG4gICAgaWYgKCFhbGxvd0NyZWF0ZSlcbiAgICAgIHJldHVybiBzdXBlci5sb2dDdHg8QVJHUywgTUVUSE9EPihcbiAgICAgICAgYXJncyxcbiAgICAgICAgb3BlcmF0aW9uIGFzIGFueSxcbiAgICAgICAgYWxsb3dDcmVhdGUgYXMgYW55LFxuICAgICAgICBvdmVycmlkZXMgYXMgYW55XG4gICAgICApIGFzIGFueTtcblxuICAgIHJldHVybiBzdXBlci5sb2dDdHhcbiAgICAgIC5jYWxsKHRoaXMsIGFyZ3MsIG9wZXJhdGlvbiBhcyBhbnksIGFsbG93Q3JlYXRlLCBvdmVycmlkZXMgYXMgYW55KVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBpZiAoIShyZXMuY3R4IGluc3RhbmNlb2YgRmFicmljQ29udHJhY3RDb250ZXh0KSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgSW52YWxpZCBjb250ZXh0IGJpbmRpbmdgKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzLCB7XG4gICAgICAgICAgc3R1YjogcmVzLmN0eC5zdHViLFxuICAgICAgICAgIGlkZW50aXR5OiByZXMuY3R4LmlkZW50aXR5LFxuICAgICAgICB9KTtcbiAgICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgeyBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBpZiAoY3R4LmlzRnVsbHlTZWdyZWdhdGVkKSByZXR1cm47XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm5vRW1pdFwiKSkgcmV0dXJuO1xuICAgIGlmICghY3R4LnN0dWIpIHJldHVybjtcbiAgICBjb25zdCBpc0J1bGsgPSBBcnJheS5pc0FycmF5KGlkKTtcbiAgICBjb25zdCBlbWl0U2luZ2xlID0gIWN0eC5nZXRPclVuZGVmaW5lZChcIm5vRW1pdFNpbmdsZVwiKTtcbiAgICBjb25zdCBlbWl0QnVsayA9ICFjdHguZ2V0T3JVbmRlZmluZWQoXCJub0VtaXRCdWxrXCIpO1xuICAgIGlmICgoaXNCdWxrICYmIGVtaXRCdWxrKSB8fCAoIWlzQnVsayAmJiBlbWl0U2luZ2xlKSkge1xuICAgICAgLy8gUGFzcyB0aGUgTVNQIG93bmVyIGZyb20gc3R1YiBhbmQgdGhlIHJlc3VsdCBwYXlsb2FkIChpZiBhbnkpIGluIHRoZVxuICAgICAgLy8gcG9zaXRpb25zIHRoZSBoYW5kbGVyIGV4cGVjdHM6ICh0YWJsZSwgZXZlbnQsIGlkLCBvd25lcj8sIHBheWxvYWQ/LCBjdHgpXG4gICAgICBjb25zdCBtc3BJZCA9IGN0eC5zdHViLmdldE1zcElEID8gY3R4LnN0dWIuZ2V0TXNwSUQoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG5vbkN0eEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTsgLy8gZXZlcnl0aGluZyBiZWZvcmUgY3R4XG4gICAgICBjb25zdCBwYXlsb2FkID0gbm9uQ3R4QXJncy5sZW5ndGggPiAwID8gbm9uQ3R4QXJnc1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgdGFibGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBpZCxcbiAgICAgICAgbXNwSWQsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJubyBsZWRnZXIgY29udGV4dFwiKSlcbiAgICAgIHJldHVybiBuZXcgTWlzc2luZ0NvbnRleHRFcnJvcihcbiAgICAgICAgYE5vIGNvbnRleHQgZm91bmQuIHRoaXMgY2FuIGJlIGNhdXNlZCBieSBkZWJ1Z2dpbmc6ICR7bXNnfWBcbiAgICAgICkgYXMgRTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgZm9yIGRlY29yYXRpb24gb3ZlcnJpZGVzXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcy9leHRlbmRzIGRlY2FmIGRlY29yYXRpb24gd2l0aCBGYWJyaWMtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eVxuICAgKiBAc3RhdGljXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKTogdm9pZCB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGUpLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZLCB7fSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgb25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGUpLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZLCB7fSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgICAgIC5leHRlbmQoRmFicmljUHJvcGVydHkoKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAgICAgLmV4dGVuZChmdW5jdGlvbiBmYWJyaWNQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcD86IGFueSkgPT4ge1xuICAgICAgICAgIFByb3BlcnR5KHByb3AsIFwic3RyaW5nOmRhdGVcIikodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuVEFCTEUpXG4gICAgICAuZXh0ZW5kKGZ1bmN0aW9uIHRhYmxlKG9iajogYW55KSB7XG4gICAgICAgIGNvbnN0IGNoYWluOiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudCA9XG4gICAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IE1ldGFkYXRhLmNvbnN0cihvYmopXG4gICAgICAgICAgICA6IE1ldGFkYXRhLmNvbnN0cihvYmouY29uc3RydWN0b3IpO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50LnByb3RvdHlwZSkge1xuICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWluLm1hcCgoYykgPT4gYy5uYW1lIHx8IGMpKTtcblxuICAgICAgICAvLyBBcHBseSBmcm9tIHRoZSBiYXNlIGNsYXNzIGRvd24gdG8gdGhlIGRlY29yYXRlZCBjbGFzc1xuICAgICAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gY2hhaW4ucG9wKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYENhbGxpbmcgb24gJHtjb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICAgIEZhYnJpY09iamVjdCgpKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGYWJyaWNPYmplY3QoKShvYmopO1xuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkZhYnJpY0NvbnRyYWN0QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iXX0=