@decaf-ts/ui-decorators 0.5.22 → 0.5.23

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.
@@ -566,7 +566,10 @@
566
566
  if (types?.length > 1)
567
567
  throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement`);
568
568
  decs.shift();
569
- decs.forEach((dec) => {
569
+ const sorted = decs.sort((a, b) => {
570
+ return a.key === UIKeys.ELEMENT ? -1 : 1;
571
+ });
572
+ sorted.forEach((dec) => {
570
573
  if (!dec)
571
574
  throw new RenderingError(`No decorator found`);
572
575
  switch (dec.key) {
@@ -598,7 +601,6 @@
598
601
  children.push(childDefinition);
599
602
  break;
600
603
  }
601
- case UIKeys.HIDDEN:
602
604
  case UIKeys.UILISTPROP: {
603
605
  mapper = mapper || {};
604
606
  if (dec.props?.name)
@@ -606,44 +608,55 @@
606
608
  const props = Object.assign({}, classDecorator.props?.item || {}, item?.props || {}, dec.props?.props || {}, globalProps);
607
609
  childProps = {
608
610
  tag: item?.tag || props.render || "",
609
- props: Object.assign({}, childProps?.props, dec.key === UIKeys.UILISTPROP ? { mapper } : { [dec.key]: dec.props }, props),
611
+ props: Object.assign({}, childProps?.props, { mapper }, props),
610
612
  };
611
613
  break;
612
614
  }
615
+ case UIKeys.HIDDEN:
613
616
  case UIKeys.ELEMENT: {
614
617
  children = children || [];
615
618
  const uiProps = dec.props;
616
- const props = Object.assign({}, uiProps.props, {
619
+ const props = Object.assign({}, childProps?.props, uiProps.props || {}, (uiProps?.props?.name ? {
617
620
  path: getPath(globalProps?.childOf, uiProps.props.name),
618
621
  childOf: undefined, // The childOf prop is passed by globalProps when it is a nested prop
619
- }, childProps?.props, globalProps);
622
+ } : {}), globalProps);
623
+ const tag = uiProps.tag || childProps?.tag;
620
624
  const childDefinition = {
621
- tag: uiProps.tag,
625
+ tag,
622
626
  props,
623
627
  };
624
- const validationDecs = validationDecorators[key];
625
- const typeDec = validationDecs.shift();
626
- for (const dec of validationDecs) {
627
- if (this.isValidatableByAttribute(dec.key)) {
628
- childDefinition.props[this.translate(dec.key)] =
629
- this.toAttributeValue(dec.key, dec.props);
630
- continue;
631
- }
632
- if (this.isValidatableByType(dec.key)) {
633
- if (dec.key === HTML5InputTypes.DATE) {
634
- childDefinition.props[UIKeys.FORMAT] =
635
- dec.props.format || HTML5DateFormat;
628
+ if (dec.key === UIKeys.ELEMENT) {
629
+ const validationDecs = validationDecorators[key];
630
+ const typeDec = validationDecs.shift();
631
+ for (const dec of validationDecs) {
632
+ if (this.isValidatableByAttribute(dec.key)) {
633
+ childDefinition.props[this.translate(dec.key)] = this.toAttributeValue(dec.key, dec.props);
634
+ continue;
635
+ }
636
+ if (this.isValidatableByType(dec.key)) {
637
+ if (dec.key === HTML5InputTypes.DATE) {
638
+ childDefinition.props[UIKeys.FORMAT] = dec.props.format || HTML5DateFormat;
639
+ }
640
+ childDefinition.props[UIKeys.TYPE] = dec.key;
641
+ continue;
636
642
  }
637
- childDefinition.props[UIKeys.TYPE] = dec.key;
638
- continue;
639
643
  }
644
+ if (!childDefinition.props[UIKeys.TYPE]) {
645
+ const basicType = typeDec.props.name;
646
+ childDefinition.props[UIKeys.TYPE] = this.translate(basicType.toLowerCase(), true);
647
+ }
648
+ childDefinition.props.value = formatByType(childDefinition.props[UIKeys.TYPE], model[key], childDefinition.props[UIKeys.FORMAT]);
649
+ children.push(childDefinition);
640
650
  }
641
- if (!childDefinition.props[UIKeys.TYPE]) {
642
- const basicType = typeDec.props.name;
643
- childDefinition.props[UIKeys.TYPE] = this.translate(basicType.toLowerCase(), true);
651
+ if (dec.key === UIKeys.HIDDEN) {
652
+ const child = children.find(c => c.props?.name === key);
653
+ if (child) {
654
+ child.props = Object.assign({}, child.props, { [dec.key]: uiProps });
655
+ }
656
+ else {
657
+ children.push(childDefinition);
658
+ }
644
659
  }
645
- childDefinition.props.value = formatByType(childDefinition.props[UIKeys.TYPE], model[key], childDefinition.props[UIKeys.FORMAT]);
646
- children.push(childDefinition);
647
660
  break;
648
661
  }
649
662
  case UIKeys.UILAYOUTITEM:
@@ -1481,7 +1494,7 @@
1481
1494
  * @const VERSION
1482
1495
  * @memberOf module:ui-decorators
1483
1496
  */
1484
- const VERSION = "0.5.22";
1497
+ const VERSION = "0.5.23";
1485
1498
 
1486
1499
  exports.EventHandler = EventHandler;
1487
1500
  exports.HTML5CheckTypes = HTML5CheckTypes;
@@ -1513,4 +1526,4 @@
1513
1526
  exports.uiprop = uiprop;
1514
1527
 
1515
1528
  }));
1516
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy91aS9jb25zdGFudHMudHMiLCIuLi9zcmMvdWkvZXJyb3JzLnRzIiwiLi4vc3JjL3VpL3V0aWxzLnRzIiwiLi4vc3JjL3VpL1JlbmRlcmluZy50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL292ZXJyaWRlcy50cyIsIi4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXJzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyBhbmQgZW51bXMgZm9yIFVJIHJlbmRlcmluZyBhbmQgdmFsaWRhdGlvblxuICogQHN1bW1hcnkgRGVmaW5lcyBrZXlzLCBtYXBwaW5ncywgYW5kIEhUTUw1IGlucHV0IHR5cGVzIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBVSSBkZWNvcmF0b3JzIGxpYnJhcnkgZm9yXG4gKiByZW5kZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBIVE1MIGVsZW1lbnQgZ2VuZXJhdGlvbi5cbiAqIEBtb2R1bGUgdWkvY29uc3RhbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGF0ZVZhbGlkYXRvcixcbiAgRGlmZlZhbGlkYXRvcixcbiAgRW1haWxWYWxpZGF0b3IsXG4gIEVxdWFsc1ZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBHcmVhdGVyVGhhblZhbGlkYXRvcixcbiAgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBMZXNzVGhhblZhbGlkYXRvcixcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yLFxuICBNYXhWYWxpZGF0b3IsXG4gIE1pbkxlbmd0aFZhbGlkYXRvcixcbiAgTWluVmFsaWRhdG9yLFxuICBNb2RlbEtleXMsXG4gIFBhc3N3b3JkVmFsaWRhdG9yLFxuICBQYXR0ZXJuVmFsaWRhdG9yLFxuICBSZXF1aXJlZFZhbGlkYXRvcixcbiAgU3RlcFZhbGlkYXRvcixcbiAgVVJMVmFsaWRhdG9yLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBmb3IgVUkgbWV0YWRhdGEgYW5kIHJlbmRlcmluZ1xuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYXMga2V5cyBmb3IgVUktcmVsYXRlZCBtZXRhZGF0YVxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSByZWxhdGVkIHRvXG4gKiBVSSBtb2RlbHMsIGVsZW1lbnRzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsaWRhdGlvbiBydWxlcy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVSUtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEJhc2UgcmVmbGVjdGlvbiBrZXkgZm9yIFVJIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlNT0RFTCAtIEtleSBmb3IgVUkgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVJFRF9CWSAtIEtleSBmb3Igc3BlY2lmeWluZyByZW5kZXJpbmcgZW5naW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRUxFTUVOVCAtIEtleSBmb3IgZWxlbWVudCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBST1AgLSBLZXkgZm9yIHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRSAtIEtleSBmb3IgbmFtZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOQU1FX1BSRUZJWCAtIFByZWZpeCBmb3IgaW5wdXQgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDVVNUT01fUFJPUFMgLSBLZXkgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RJVEVNIC0gS2V5IGZvciBsaXN0IGl0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RQUk9QIC0gS2V5IGZvciBsaXN0IHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSAtIEtleSBmb3IgdHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQl9UWVBFIC0gS2V5IGZvciBzdWJ0eXBlIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gS2V5IGZvciBoaWRkZW4gYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRk9STUFUIC0gS2V5IGZvciBmb3JtYXQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFEX09OTFkgLSBLZXkgZm9yIHJlYWRvbmx5IGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIC0gS2V5IGZvciByZXF1aXJlZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIC0gS2V5IGZvciBtaW5pbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIC0gS2V5IGZvciBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIC0gS2V5IGZvciBtYXhpbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVhfTEVOR1RIIC0gS2V5IGZvciBtYXhpbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiAtIEtleSBmb3IgcGF0dGVybiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gS2V5IGZvciBVUkwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgLSBLZXkgZm9yIHN0ZXAgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBLZXkgZm9yIGRhdGUgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gS2V5IGZvciBlbWFpbCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBLZXkgZm9yIHBhc3N3b3JkIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTFMgLSBLZXkgZm9yIGVxdWFsaXR5IHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGIC0gS2V5IGZvciBkaWZmZXJlbmNlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMRVNTX1RIQU4gLSBLZXkgZm9yIGxlc3MgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOX09SX0VRVUFMIC0gS2V5IGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEdSRUFURVJfVEhBTiAtIEtleSBmb3IgZ3JlYXRlciB0aGFuIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uXG4gKlxuICogQGNvbnN0IFVJS2V5c1xuICogQHR5cGUge1VJS2V5c1R5cGV9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVUlLZXlzID0ge1xuICBSRUZMRUNUOiBgJHtNb2RlbEtleXMuUkVGTEVDVH0udWkuYCxcbiAgVUlNT0RFTDogXCJ1aW1vZGVsXCIsXG4gIFJFTkRFUkVEX0JZOiBcInJlbmRlcmVkLWJ5XCIsXG4gIEVMRU1FTlQ6IFwiZWxlbWVudFwiLFxuICBQUk9QOiBcInByb3BcIixcbiAgQ0hJTEQ6IFwiY2hpbGRcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIE5BTUVfUFJFRklYOiBcImlucHV0LVwiLFxuICBDVVNUT01fUFJPUFM6IFwiY3VzdG9tVmFsaWRhdGlvblByb3BzXCIsXG5cbiAgVUlMSVNUSVRFTTogXCJ1aWxpc3RpdGVtXCIsXG4gIFVJTElTVFBST1A6IFwibGlzdHByb3BcIixcbiAgVUlMQVlPVVQ6IFwidWlsYXlvdXRcIixcbiAgVUlMQVlPVVRJVEVNOiBcInVpbGF5b3V0aXRlbVwiLFxuICBIQU5ETEVSUzogXCJoYW5kbGVyc1wiLFxuXG4gIFRZUEU6IFwidHlwZVwiLFxuICBTVUJfVFlQRTogXCJzdWJ0eXBlXCIsXG5cbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBGT1JNQVQ6IFwiZm9ybWF0XCIsXG5cbiAgUkVBRF9PTkxZOiBcInJlYWRvbmx5XCIsXG4gIFJFUVVJUkVEOiBWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCxcbiAgTUlOOiBWYWxpZGF0aW9uS2V5cy5NSU4sXG4gIE1JTl9MRU5HVEg6IFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgsXG4gIE1BWDogVmFsaWRhdGlvbktleXMuTUFYLFxuICBNQVhfTEVOR1RIOiBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RILFxuICBQQVRURVJOOiBWYWxpZGF0aW9uS2V5cy5QQVRURVJOLFxuICBVUkw6IFZhbGlkYXRpb25LZXlzLlVSTCxcbiAgU1RFUDogVmFsaWRhdGlvbktleXMuU1RFUCxcbiAgREFURTogVmFsaWRhdGlvbktleXMuREFURSxcbiAgRU1BSUw6IFZhbGlkYXRpb25LZXlzLkVNQUlMLFxuICBQQVNTV09SRDogVmFsaWRhdGlvbktleXMuUEFTU1dPUkQsXG4gIEVRVUFMUzogVmFsaWRhdGlvbktleXMuRVFVQUxTLFxuICBESUZGOiBWYWxpZGF0aW9uS2V5cy5ESUZGLFxuICBMRVNTX1RIQU46IFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTixcbiAgTEVTU19USEFOX09SX0VRVUFMOiBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEdSRUFURVJfVEhBTjogVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6IFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgaW5wdXQgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3JzXG4gKiBAc3VtbWFyeSBNYXBzIHNwZWNpYWwgaW5wdXQgdHlwZXMgdG8gdGhlaXIgdmFsaWRhdG9yIGNsYXNzZXNcbiAqIFRoaXMgY29uc3RhbnQgbWFwcyBpbnB1dCB0eXBlcyBsaWtlIGVtYWlsLCBVUkwsIGRhdGUsIGFuZCBwYXNzd29yZCB0byB0aGVpclxuICogY29ycmVzcG9uZGluZyB2YWxpZGF0b3IgY2xhc3NlcyBmcm9tIHRoZSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj59IFZhbGlkYXRhYmxlQnlUeXBlTWFwXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEVtYWlsVmFsaWRhdG9yPn0gZW1haWwgLSBWYWxpZGF0b3IgZm9yIGVtYWlsIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxVUkxWYWxpZGF0b3I+fSB1cmwgLSBWYWxpZGF0b3IgZm9yIFVSTCBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RGF0ZVZhbGlkYXRvcj59IGRhdGUgLSBWYWxpZGF0b3IgZm9yIGRhdGUgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFBhc3N3b3JkVmFsaWRhdG9yPn0gcGFzc3dvcmQgLSBWYWxpZGF0b3IgZm9yIHBhc3N3b3JkIGlucHV0c1xuICpcbiAqIEBjb25zdCBWYWxpZGF0YWJsZUJ5VHlwZVxuICogQHR5cGUge1ZhbGlkYXRhYmxlQnlUeXBlTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRhYmxlQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+PiA9IHtcbiAgW1VJS2V5cy5FTUFJTF06IEVtYWlsVmFsaWRhdG9yLFxuICBbVUlLZXlzLlVSTF06IFVSTFZhbGlkYXRvcixcbiAgW1VJS2V5cy5EQVRFXTogRGF0ZVZhbGlkYXRvcixcbiAgW1VJS2V5cy5QQVNTV09SRF06IFBhc3N3b3JkVmFsaWRhdG9yLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3JzXG4gKiBAc3VtbWFyeSBNYXBzIEhUTUwgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZWlyIHZhbGlkYXRvciBjbGFzc2VzXG4gKiBUaGlzIGNvbnN0YW50IG1hcHMgSFRNTCB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgbGlrZSByZXF1aXJlZCwgbWluLCBtYXgsIHBhdHRlcm4sIGV0Yy5cbiAqIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yIGNsYXNzZXMgZnJvbSB0aGUgZGVjb3JhdG9yLXZhbGlkYXRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+fSBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlTWFwXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFJlcXVpcmVkVmFsaWRhdG9yPn0gcmVxdWlyZWQgLSBWYWxpZGF0b3IgZm9yIHJlcXVpcmVkIGZpZWxkc1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNaW5WYWxpZGF0b3I+fSBtaW4gLSBWYWxpZGF0b3IgZm9yIG1pbmltdW0gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWF4VmFsaWRhdG9yPn0gbWF4IC0gVmFsaWRhdG9yIGZvciBtYXhpbXVtIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFN0ZXBWYWxpZGF0b3I+fSBzdGVwIC0gVmFsaWRhdG9yIGZvciBzdGVwIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1pbkxlbmd0aFZhbGlkYXRvcj59IG1pbmxlbmd0aCAtIFZhbGlkYXRvciBmb3IgbWluaW11bSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWF4TGVuZ3RoVmFsaWRhdG9yPn0gbWF4bGVuZ3RoIC0gVmFsaWRhdG9yIGZvciBtYXhpbXVtIGxlbmd0aFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxQYXR0ZXJuVmFsaWRhdG9yPn0gcGF0dGVybiAtIFZhbGlkYXRvciBmb3IgcmVnZXggcGF0dGVyblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxFcXVhbHNWYWxpZGF0b3I+fSBlcXVhbHMgLSBWYWxpZGF0b3IgZm9yIGVxdWFsaXR5XG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPERpZmZWYWxpZGF0b3I+fSBkaWZmIC0gVmFsaWRhdG9yIGZvciBkaWZmZXJlbmNlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPExlc3NUaGFuVmFsaWRhdG9yPn0gbGVzc3RoYW4gLSBWYWxpZGF0b3IgZm9yIGxlc3MgdGhhbiBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcj59IGxlc3N0aGFub3JlcXVhbCAtIFZhbGlkYXRvciBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8R3JlYXRlclRoYW5WYWxpZGF0b3I+fSBncmVhdGVydGhhbiAtIFZhbGlkYXRvciBmb3IgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8R3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yPn0gZ3JlYXRlcnRoYW5vcmVxdWFsIC0gVmFsaWRhdG9yIGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICpcbiAqIEBjb25zdCBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlXG4gKiBAdHlwZSB7VmFsaWRhdGFibGVCeUF0dHJpYnV0ZU1hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlOiBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+PiA9IHtcbiAgW1VJS2V5cy5SRVFVSVJFRF06IFJlcXVpcmVkVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1JTl06IE1pblZhbGlkYXRvcixcbiAgW1VJS2V5cy5NQVhdOiBNYXhWYWxpZGF0b3IsXG4gIFtVSUtleXMuU1RFUF06IFN0ZXBWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUlOX0xFTkdUSF06IE1pbkxlbmd0aFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NQVhfTEVOR1RIXTogTWF4TGVuZ3RoVmFsaWRhdG9yLFxuICBbVUlLZXlzLlBBVFRFUk5dOiBQYXR0ZXJuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkVRVUFMU106IEVxdWFsc1ZhbGlkYXRvcixcbiAgW1VJS2V5cy5ESUZGXTogRGlmZlZhbGlkYXRvcixcbiAgW1VJS2V5cy5MRVNTX1RIQU5dOiBMZXNzVGhhblZhbGlkYXRvcixcbiAgW1VJS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIFtVSUtleXMuR1JFQVRFUl9USEFOXTogR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIGZvciBIVE1MNSBkYXRlIGlucHV0c1xuICogQHN1bW1hcnkgRm9ybWF0IHN0cmluZyBmb3IgSFRNTDUgZGF0ZSBpbnB1dHMgKHl5eXktTU0tZGQpXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgdGhlIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciBIVE1MNSBkYXRlIGlucHV0cy5cbiAqXG4gKiBAY29uc3QgSFRNTDVEYXRlRm9ybWF0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1RGF0ZUZvcm1hdCA9IFwieXl5eS1NTS1kZFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb2xsZWN0aW9uIG9mIEhUTUw1IGlucHV0IHR5cGUgdmFsdWVzXG4gKiBAc3VtbWFyeSBNYXBzIGlucHV0IHR5cGUgY29uc3RhbnRzIHRvIHRoZWlyIEhUTUwgYXR0cmlidXRlIHZhbHVlc1xuICogVGhpcyBjb25zdGFudCBwcm92aWRlcyBhIG1hcHBpbmcgb2YgaW5wdXQgdHlwZSBjb25zdGFudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZ1xuICogSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1c2UgaW4gZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIVE1MNUlucHV0VHlwZXNNYXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCVVRUT04gLSBCdXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IENIRUNLQk9YIC0gQ2hlY2tib3ggaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IENPTE9SIC0gQ29sb3IgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gRGF0ZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEVUSU1FX0xPQ0FMIC0gTG9jYWwgZGF0ZXRpbWUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEVtYWlsIGlucHV0IHR5cGUgd2l0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRklMRSAtIEZpbGUgdXBsb2FkIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBISURERU4gLSBIaWRkZW4gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElNQUdFIC0gSW1hZ2UgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PTlRIIC0gTW9udGggcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVIgLSBOdW1lcmljIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVNTV09SRCAtIFBhc3N3b3JkIGlucHV0IHR5cGUgd2l0aCBtYXNrZWQgdGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJBRElPIC0gUmFkaW8gYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSQU5HRSAtIFJhbmdlIHNsaWRlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVTRVQgLSBGb3JtIHJlc2V0IGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VBUkNIIC0gU2VhcmNoIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJNSVQgLSBGb3JtIHN1Ym1pdCBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRFTCAtIFRlbGVwaG9uZSBudW1iZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRFWFQgLSBCYXNpYyB0ZXh0IGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FIC0gVGltZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIFVSTCBpbnB1dCB0eXBlIHdpdGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFdFRUsgLSBXZWVrIHBpY2tlciBpbnB1dCB0eXBlXG4gKlxuICogQGNvbnN0IEhUTUw1SW5wdXRUeXBlc1xuICogQHR5cGUge0hUTUw1SW5wdXRUeXBlc01hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNUlucHV0VHlwZXMgPSB7XG4gIEJVVFRPTjogXCJidXR0b25cIixcbiAgQ0hFQ0tCT1g6IFwiY2hlY2tib3hcIixcbiAgQ09MT1I6IFwiY29sb3JcIixcbiAgREFURTogVUlLZXlzLkRBVEUsXG4gIERBVEVUSU1FX0xPQ0FMOiBcImRhdGV0aW1lLWxvY2FsXCIsXG4gIEVNQUlMOiBVSUtleXMuRU1BSUwsXG4gIEZJTEU6IFwiZmlsZVwiLFxuICBISURERU46IFwiaGlkZGVuXCIsXG4gIElNQUdFOiBcImltYWdlXCIsXG4gIE1PTlRIOiBcIm1vbnRoXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbiAgUEFTU1dPUkQ6IFVJS2V5cy5QQVNTV09SRCxcbiAgUkFESU86IFwicmFkaW9cIixcbiAgUkFOR0U6IFwicmFuZ2VcIixcbiAgUkVTRVQ6IFwicmVzZXRcIixcbiAgU0VBUkNIOiBcInNlYXJjaFwiLFxuICBTVUJNSVQ6IFwic3VibWl0XCIsXG4gIFRFTDogXCJ0ZWxcIixcbiAgVEVYVDogXCJ0ZXh0XCIsXG4gIFRFWFRBUkVBOiAndGV4dGFyZWEnLFxuICBTRUxFQ1Q6ICdzZWxlY3QnLFxuICBUSU1FOiBcInRpbWVcIixcbiAgVVJMOiBVSUtleXMuVVJMLFxuICBXRUVLOiBcIndlZWtcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgdXNlIGNoZWNrYm94ZXNcbiAqIEBzdW1tYXJ5IExpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnQgY2hlY2thYmxlIGNvbnRyb2xzXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgYW4gYXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnRcbiAqIGNoZWNrYWJsZSBjb250cm9scyAoY2hlY2tib3ggYW5kIHJhZGlvKS5cbiAqXG4gKiBAY29uc3QgSFRNTDVDaGVja1R5cGVzXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVDaGVja1R5cGVzID0gW1xuICBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1gsXG4gIEhUTUw1SW5wdXRUeXBlcy5SQURJTyxcbl07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSByZW5kZXJpbmcgb3BlcmF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBTcGVjaWFsaXplZCBlcnJvciBmb3IgcmVuZGVyaW5nIGZhaWx1cmVzIGluIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIHJlbmRlcmluZyBlbmdpbmUgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZVxuICogYXR0ZW1wdGluZyB0byByZW5kZXIgYSBVSSBjb21wb25lbnQgb3IgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93aW5nIGEgcmVuZGVyaW5nIGVycm9yXG4gKiB0cnkge1xuICogICAvLyBSZW5kZXJpbmcgY29kZSB0aGF0IG1pZ2h0IGZhaWxcbiAqICAgaWYgKCFjb21wb25lbnQuY2FuUmVuZGVyKCkpIHtcbiAqICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoJ0NvbXBvbmVudCBjYW5ub3QgYmUgcmVuZGVyZWQnKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVuZGVyaW5nIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlcmluZ0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFJlbmRlcmluZ0Vycm9yIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBlcnJvciB3aXRoIGEgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIFRoZSBlcnJvciBtZXNzYWdlIG9yIG9yaWdpbmFsIGVycm9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUmVuZGVyaW5nRXJyb3IubmFtZSwgbXNnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgZm9ybWF0RGF0ZSxcbiAgTW9kZWwsXG4gIHBhcnNlRGF0ZSxcbiAgUmVzZXJ2ZWRNb2RlbHMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEhUTUw1RGF0ZUZvcm1hdCwgSFRNTDVJbnB1dFR5cGVzLCBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGaWVsZFByb3BlcnRpZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBmdW5jdGlvbiBmb3JtYXRCeVR5cGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5VHlwZShcbiAgdHlwZTogYW55LFxuICB2YWx1ZTogYW55LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IHN0cmluZyB8IG51bWJlciB7XG4gIGlmICh0eXBlID09PSBVSUtleXMuREFURSkge1xuICAgIGlmKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSAoYXJncy5zaGlmdCgpIGFzIHN0cmluZykgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHZhbHVlKSwgZm9ybWF0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQnlUeXBlKFxuICB0eXBlOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGZpZWxkUHJvcHM6IEZpZWxkUHJvcGVydGllc1xuKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgQXJyYXkubmFtZToge1xuICAgICAgY29uc3QgcGFyc2VkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAgdmFsdWUubWFwKHYgPT4gcGFyc2VWYWx1ZUJ5VHlwZShcbiAgICAgICAgUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLCB2LCBmaWVsZFByb3BzXG4gICAgICApKSA6IFt2YWx1ZV07XG4gICAgICByZXN1bHQgPSBwYXJzZWQuam9pbihcIixcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgcmVzdWx0ID0gcGFyc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOiB7XG4gICAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpZWxkUHJvcHMuZm9ybWF0O1xuICAgICAgaWYodmFsdWUgJiYgYCR7dmFsdWV9YC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5OVU1CRVJcbiAgICAgICAgICAgID8gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgID8gZm9ybWF0XG4gICAgICAgICAgICAgICAgPyBwYXJzZURhdGUoZm9ybWF0LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmVzdWx0ID0gXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuT0JKRUNUID8gXG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbihcIixcIikgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDpcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTiA/XG4gICAgICAgICAgICAgIHZhbHVlIDogdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5TVFJJTkcgPyBcbiAgICAgICAgICAgICAgICBlc2NhcGVIdG1sKHZhbHVlIGFzIHN0cmluZykgOiByZXN1bHQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdmFsdWUgb2YgdHlwZSAke3R5cGV9IGZyb20gJHt0eXBlb2YgdmFsdWV9IC0gJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4ocGFyc2VkKSkgcmV0dXJuIHBhcnNlZDtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJlwiOiBcIiZhbXA7XCIsXG4gICAgXCI8XCI6IFwiJmx0O1wiLFxuICAgIFwiPlwiOiBcIiZndDtcIixcbiAgfTtcbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyY8Pl0vZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVydEh0bWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJmFtcDtcIjogXCImXCIsXG4gICAgXCImbHQ7XCI6IFwiPFwiLFxuICAgIFwiJmd0O1wiOiBcIj5cIixcbiAgfTtcblxuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC8mbHQ7fCZndDt8JmFtcDsvZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlNb2RlbElEPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgbGV0IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgaWQgPSBmaW5kTW9kZWxJZChtb2RlbCkgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIGlkID0gRGF0ZS5ub3coKTtcbiAgfVxuICBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgcmV0dXJuIGAke25hbWV9LSR7aWR9YDtcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUNsYXNzTWV0YWRhdGEsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxheW91dEl0ZW1NZXRhZGF0YSxcbiAgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlNb2RlbE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgZm9ybWF0QnlUeXBlLCBnZW5lcmF0ZVVJTW9kZWxJRCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGNsYXNzIGZvciByZW5kZXJpbmcgVUkgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IFRoZSBSZW5kZXJpbmdFbmdpbmUgY2xhc3MgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGNvbnZlcnRpbmcgbW9kZWwgbWV0YWRhdGEgaW50byBVSSBmaWVsZCBkZWZpbml0aW9ucy5cbiAqIEl0IGhhbmRsZXMgdGhlIHRyYW5zbGF0aW9uIG9mIG1vZGVsIHByb3BlcnRpZXMgdG8gVUkgZWxlbWVudHMsIGFwcGxpZXMgdmFsaWRhdGlvbiBydWxlcywgYW5kIG1hbmFnZXMgZGlmZmVyZW50IHJlbmRlcmluZyBmbGF2b3JzLlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZCBieSBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgcmVzdWx0LCBkZWZhdWx0cyB0byB2b2lkXG4gKiBAdGVtcGxhdGUgUiBUaGUgdHlwZSBvZiB0aGUgZmllbGQgZGVmaW5pdGlvbiwgZGVmYXVsdHMgdG8gRmllbGREZWZpbml0aW9uPFQ+XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFbmdpbmVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcmluZ0VuZ2luZTxUID0gdm9pZCwgUiA9IEZpZWxkRGVmaW5pdGlvbjxUPj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhY2hlIGZvciBzdG9yaW5nIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2VzIG9yIGNvbnN0cnVjdG9ycy5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnRseSBhY3RpdmUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDpcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPjtcblxuICAvKipcbiAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlbmRlcmluZyBlbmdpbmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgZmxhdm91cjogc3RyaW5nKSB7XG4gICAgUmVuZGVyaW5nRW5naW5lLnJlZ2lzdGVyKHRoaXMpO1xuICAgIGNvbnNvbGUubG9nKGBkZWNhZidzICR7Zmxhdm91cn0gcmVuZGVyaW5nIGVuZ2luZSBsb2FkZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIGZvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgYmV0d2VlbiBtb2RlbCB0eXBlcyBhbmQgSFRNTCBpbnB1dCB0eXBlcy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgbW9kZWwgZGF0YSB0eXBlcyB0byBhcHByb3ByaWF0ZSBIVE1MIGlucHV0IHR5cGVzIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0cmFuc2xhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvVmlldz10cnVlXSAtIERpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAodHJ1ZSBmb3IgbW9kZWwgdG8gdmlldywgZmFsc2UgZm9yIHZpZXcgdG8gbW9kZWwpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJhbnNsYXRlZCB0eXBlLlxuICAgKi9cbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCB0b1ZpZXc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodG9WaWV3KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLlNUUklORzpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLlRFWFQ7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSOlxuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkJJR0lOVDpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CT09MRUFOOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuREFURTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkRBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlNFTEVDVDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVYVDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuRU1BSUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNPTE9SOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5QQVNTV09SRDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5VUkw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlNFQVJDSDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuSElEREVOOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUQVJFQTpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuUkFESU86XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLlNUUklORztcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVI7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YOiBcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTjtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURTpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURVRJTUVfTE9DQUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRJTUU6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkRBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBjbGFzcyBkZWNvcmF0b3IgbWV0YWRhdGEgZm9yIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgVUktcmVsYXRlZCBjbGFzcyBkZWNvcmF0b3JzIGZyb20gYSBtb2RlbCBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5XG4gICAqIFRoaXMgbWV0aG9kIGNvbGxlY3RzIG1ldGFkYXRhIGZyb20gdmFyaW91cyBVSSBjbGFzcyBkZWNvcmF0b3JzIGluY2x1ZGluZyBAdWltb2RlbCxcbiAgICogQHVpbGlzdGl0ZW0sIEB1aWhhbmRsZXJzLCBhbmQgQHVpbGF5b3V0IGFwcGxpZWQgdG8gdGhlIG1vZGVsIGNsYXNzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyB7VUlDbGFzc01ldGFkYXRhW119IEFycmF5IG9mIFVJIGNsYXNzIG1ldGFkYXRhIG9iamVjdHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSk6IFVJQ2xhc3NNZXRhZGF0YVtdICB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksXG4gICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMQVlPVVQpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMQVlPVVQpLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pOztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBpdHMgbmF0dXJlLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVUkga2V5IHJlcHJlc2VudHMgYSB0eXBlIHRoYXQgaXMgaW5oZXJlbnRseSB2YWxpZGF0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZGF0YWJsZUJ5VHlwZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5VHlwZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHZhbGlkYXRpb24gdGhhdCBjYW4gYmUgYXBwbGllZCBhcyBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgVUkga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdmFsaWRhdGlvbiBtZXRhZGF0YSB0byBhbiBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdmFsaWRhdGlvbiBtZXRhZGF0YSBpbnRvIGEgdmFsdWUgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB2YWxpZGF0aW9uIGtleS5cbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uTWV0YWRhdGF9IHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSBUaGUgY29udmVydGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBrZXkgaXMgbm90IHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICovXG4gIHByb3RlY3RlZCB0b0F0dHJpYnV0ZVZhbHVlKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBhdHRyaWJ1dGUga2V5IFwiJHtrZXl9XCIuIEV4cGVjdGVkIG9uZSBvZjogJHtPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5qb2luKFwiLCBcIil9LmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4ga2V5ID09PSBVSUtleXMuUkVRVUlSRUQgPyB0cnVlIDogdmFsdWVba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBtb2RlbCB0byBhIGZpZWxkIGRlZmluaXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGluc3RhbmNlLCBleHRyYWN0aW5nIFVJLXJlbGF0ZWQgbWV0YWRhdGEgYW5kIHZhbGlkYXRpb24gcnVsZXMgdG8gY3JlYXRlIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFQgVHlwZSByZWZlcmVuY2luZyB0aGUgc3BlY2lmaWMgUmVuZGVyaW5nIGVuZ2luZSBmaWVsZCBwcm9wZXJ0aWVzL2lucHV0c1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNvbnZlcnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtnbG9iYWxQcm9wcz17fV0gLSBHbG9iYWwgcHJvcGVydGllcyB0byBhcHBseSB0byBhbGwgY2hpbGQgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dlbmVyYXRlSWQ9dHJ1ZV0gLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwb3B1bGF0ZSB0aGUgcmVuZGVyZXJJZCBwcm9wZXJ0eS5cbiAgICogQHJldHVybnMge0ZpZWxkRGVmaW5pdGlvbjxUPn0gQSBmaWVsZCBkZWZpbml0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFVJIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwuXG4gICAqIEB0aHJvd3Mge1JlbmRlcmluZ0Vycm9yfSBJZiBubyBVSSBkZWZpbml0aW9ucyBhcmUgc2V0IGZvciB0aGUgbW9kZWwgb3IgaWYgdGhlcmUgYXJlIGludmFsaWQgZGVjb3JhdG9ycy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICAgKiAgcGFydGljaXBhbnQgUkUgYXMgUmVuZGVyaW5nRW5naW5lXG4gICAqICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAgICogIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogIEMtPj5SRTogdG9GaWVsZERlZmluaXRpb24obW9kZWwsIGdsb2JhbFByb3BzKVxuICAgKiAgUkUtPj5SOiBnZXRNZXRhZGF0YShVSUtleXMuVUlNT0RFTCwgbW9kZWwuY29uc3RydWN0b3IpXG4gICAqICBSLS0+PlJFOiBVSU1vZGVsTWV0YWRhdGFcbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+XG4gICAqICBSRS0+PlI6IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVmFsaWRhdGlvbktleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT5cbiAgICogIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgUkUtPj5SRTogUHJvY2VzcyBVSSBkZWNvcmF0b3JzXG4gICAqICAgIFJFLT4+UkU6IEFwcGx5IHZhbGlkYXRpb24gcnVsZXNcbiAgICogIGVuZFxuICAgKiAgUkUtLT4+QzogRmllbGREZWZpbml0aW9uPFQ+XG4gICAqL1xuICBwcm90ZWN0ZWQgdG9GaWVsZERlZmluaXRpb248TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgICBnZW5lcmF0ZUlkOiBib29sZWFuID0gdHJ1ZVxuICApOiBGaWVsZERlZmluaXRpb248VD4ge1xuICAgIFxuICAgIGNvbnN0IHsgaW5oZXJpdFByb3BzLCAuLi5nbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cyB9ID0gZ2xvYmFsUHJvcHM7XG4gICAgZ2xvYmFsUHJvcHMgPSBnbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cztcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9ycyA9IHRoaXMuZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TT4obW9kZWwpO1xuXG4gICAgaWYgKCFjbGFzc0RlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICBgTm8gdWkgZGVmaW5pdGlvbnMgc2V0IGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9LiBEaWQgeW91IHVzZSBAdWltb2RlbD9gXG4gICAgICApO1xuXG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3IgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICAuLi5jbGFzc0RlY29yYXRvcnMsXG4gICAgICBpbmhlcml0UHJvcHMgPyBpbmhlcml0UHJvcHMgOiB7fSAvLyBvdmVycmlkZSB0YWcgYW5kIHByb3BlcnRpZXMgd2hlbiBpdCBpcyBhIGNvbXBvbmVudCB0aGF0IHNob3VsZCBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBpdHMgcGFyZW50LlxuICAgICk7XG4gICAgY29uc3QgeyB0YWcsIHByb3BzLCBpdGVtLCBoYW5kbGVycyB9ID0gY2xhc3NEZWNvcmF0b3I7XG5cbiAgICBjb25zdCB1aURlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+ID1cbiAgICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVCkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIERlY29yYXRvck1ldGFkYXRhW11cbiAgICAgID47XG4gICAgbGV0IGNoaWxkcmVuOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2hpbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IGl0ZW0/LnByb3BzIHx8IHt9O1xuICAgIGxldCBtYXBwZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBnZXRQYXRoID0gKHBhcmVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBwYXJlbnQgPyBbcGFyZW50LCBwcm9wXS5qb2luKFwiLlwiKSA6IHByb3A7XG4gICAgfTtcblxuICAgIGlmICh1aURlY29yYXRvcnMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdXG4gICAgICA+ID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICApIGFzIFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT47XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB1aURlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHVpRGVjb3JhdG9yc1trZXldO1xuICAgICAgICBjb25zdCB0eXBlcyA9IE9iamVjdC52YWx1ZXMoZGVjcykuZmlsdGVyKCh7a2V5fSkgPT4gW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgaWYgKHR5cGVzPy5sZW5ndGggPiAxKVxuICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgIGBPbmx5IG9uZSB0eXBlIG9mIGRlY29yYXRpb24gaXMgYWxsb3dlZC4gUGxlYXNlIGNob29zZSBiZXR3ZWVuIEB1aXByb3AsIEB1aWNoaWxkIG9yIEB1aWVsZW1lbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVjcy5zaGlmdCgpO1xuICAgICAgICBkZWNzLmZvckVhY2goKGRlYykgPT4ge1xuICAgICAgICAgIGlmICghZGVjKSB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYE5vIGRlY29yYXRvciBmb3VuZGApO1xuXG4gICAgICAgICAgc3dpdGNoIChkZWMua2V5KSB7XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5QUk9QOiB7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5XSA9IGRlYy5wcm9wcyBhcyBVSVByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5DSElMRDoge1xuICAgICAgICAgICAgICBpZiAoIU1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwga2V5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYENoaWxkIFwiJHtrZXl9XCIgbXVzdCBiZSBhIG1vZGVsLmApO1xuXG4gICAgICAgICAgICAgIGxldCBDbGF6ejtcbiAgICAgICAgICAgICAgY29uc3Qgc3VibW9kZWwgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSBhcyBNb2RlbDtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0YWJsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHN1Ym1vZGVsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzdWJtb2RlbCk7XG4gICAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnN0YW5jZSBpZiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKGRlYy5wcm9wcy5wcm9wcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAgICAgICAgICAgPy5uYW1lIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBDbGF6eiA9IG5ldyAoTW9kZWwuZ2V0KGNsYXp6TmFtZSkgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD4pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbkdsb2JhbFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZ2xvYmFsUHJvcHMgfHwge30sIHtcIm1vZGVsXCI6IENsYXp6fSAse1xuICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZE9mOiBnZXRQYXRoKGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZywga2V5KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkhJRERFTjogXG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5VSUxJU1RQUk9QOiB7XG4gICAgICAgICAgICAgIG1hcHBlciA9IG1hcHBlciB8fCB7fTtcbiAgICAgICAgICAgICAgaWYoZGVjLnByb3BzPy5uYW1lKVxuICAgICAgICAgICAgICAgIG1hcHBlcltkZWMucHJvcHM/Lm5hbWUgYXMgc3RyaW5nXSA9IGtleTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIGNsYXNzRGVjb3JhdG9yLnByb3BzPy5pdGVtIHx8IHt9LFxuICAgICAgICAgICAgICAgIGl0ZW0/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGRlYy5wcm9wcz8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IGl0ZW0/LnRhZyB8fCBwcm9wcy5yZW5kZXIgfHwgXCJcIixcbiAgICAgICAgICAgICAgICBwcm9wczogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgIHt9LCBcbiAgICAgICAgICAgICAgICAgIGNoaWxkUHJvcHM/LnByb3BzLCBcbiAgICAgICAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5VSUxJU1RQUk9QID8geyBtYXBwZXIgfSA6IHtbZGVjLmtleV06IGRlYy5wcm9wc30sIFxuICAgICAgICAgICAgICAgICAgcHJvcHMpLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuRUxFTUVOVDoge1xuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHVpUHJvcHM6IFVJRWxlbWVudE1ldGFkYXRhID0gZGVjLnByb3BzIGFzIFVJRWxlbWVudE1ldGFkYXRhO1xuICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgdWlQcm9wcy5wcm9wcyBhcyBhbnksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIS5uYW1lXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY2hpbGRPZjogdW5kZWZpbmVkLCAvLyBUaGUgY2hpbGRPZiBwcm9wIGlzIHBhc3NlZCBieSBnbG9iYWxQcm9wcyB3aGVuIGl0IGlzIGEgbmVzdGVkIHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkUHJvcHM/LnByb3BzLFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gICAgICAgICAgICAgICAgdGFnOiB1aVByb3BzLnRhZyxcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRGVjczogRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdID1cbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRGVjb3JhdG9yc1tcbiAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIF0gYXMgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVEZWM6IERlY29yYXRvck1ldGFkYXRhT2JqZWN0ID1cbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRGVjcy5zaGlmdCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiB2YWxpZGF0aW9uRGVjcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW3RoaXMudHJhbnNsYXRlKGRlYy5rZXkpXSA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9BdHRyaWJ1dGVWYWx1ZShkZWMua2V5LCBkZWMucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeVR5cGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWMua2V5ID09PSBIVE1MNUlucHV0VHlwZXMuREFURSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF0gPVxuICAgICAgICAgICAgICAgICAgICAgIGRlYy5wcm9wcy5mb3JtYXQgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IGRlYy5rZXk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNpY1R5cGUgPSAodHlwZURlYy5wcm9wcyBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0gPSB0aGlzLnRyYW5zbGF0ZShcbiAgICAgICAgICAgICAgICAgIGJhc2ljVHlwZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHMudmFsdWUgPSBmb3JtYXRCeVR5cGUoXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSxcbiAgICAgICAgICAgICAgICBtb2RlbFtrZXkgYXMga2V5b2YgTV0sXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZERlZmluaXRpb24pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTEFZT1VUSVRFTTogXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgSW52YWxpZCBrZXk6ICR7ZGVjLmtleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdsb2JhbFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIGdsb2JhbFByb3BzLCB7XG4gICAgICBoYW5kbGVyczogaGFuZGxlcnMgfHwge30sXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiBGaWVsZERlZmluaXRpb248VD4gPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIGl0ZW06IGNoaWxkUHJvcHMgYXMgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgICAgIHByb3BzOiBnbG9iYWxQcm9wcyBhcyBUICYgRmllbGRQcm9wZXJ0aWVzLFxuICAgICAgY2hpbGRyZW46ICgoT2JqZWN0LmtleXModWlEZWNvcmF0b3JzKT8ubGVuZ3RoICYmIGNoaWxkcmVuPy5sZW5ndGgpID8gXG4gICAgICAgIHRoaXMuZ2V0TGF5b3V0SXRlbXMoY2hpbGRyZW4sIHVpRGVjb3JhdG9ycykgOiBjaGlsZHJlbiksXG4gICAgXG4gICAgfTtcblxuICAgIGlmIChnZW5lcmF0ZUlkKSByZXN1bHQucmVuZGVyZXJJZCA9IGdlbmVyYXRlVUlNb2RlbElEKG1vZGVsKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbGF5b3V0IGl0ZW1zIGZvciBncmlkIHBvc2l0aW9uaW5nXG4gICAqIEBzdW1tYXJ5IE1hcHMgY2hpbGQgZmllbGQgZGVmaW5pdGlvbnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBsYXlvdXQgcG9zaXRpb25zXG4gICAqIFRoaXMgbWV0aG9kIGl0ZXJhdGVzIHRocm91Z2ggY2hpbGQgZmllbGQgZGVmaW5pdGlvbnMgYW5kIGFwcGxpZXMgbGF5b3V0IG1ldGFkYXRhXG4gICAqIGZyb20gQHVpbGF5b3V0aXRlbSBkZWNvcmF0b3JzIHRvIHBvc2l0aW9uIHRoZW0gY29ycmVjdGx5IGluIGEgZ3JpZCBsYXlvdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RmllbGREZWZpbml0aW9uW119IGNoaWxkcmVuIC0gQXJyYXkgb2YgY2hpbGQgZmllbGQgZGVmaW5pdGlvbnMgdG8gcHJvY2Vzc1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHVpRGVjb3JhdG9ycyAtIFVJIGRlY29yYXRvciBtZXRhZGF0YSBrZXllZCBieSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm5zIHtGaWVsZERlZmluaXRpb25bXX0gQXJyYXkgb2YgZmllbGQgZGVmaW5pdGlvbnMgd2l0aCBsYXlvdXQgcG9zaXRpb25pbmcgYXBwbGllZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnRlcm5hbCB1c2FnZSAtIHBvc2l0aW9ucyBjaGlsZHJlbiBpbiBncmlkIGxheW91dFxuICAgKiBjb25zdCBsYXlvdXRDaGlsZHJlbiA9IHRoaXMuZ2V0TGF5b3V0SXRlbXMoY2hpbGREZWZpbml0aW9ucywgZGVjb3JhdG9yTWV0YWRhdGEpO1xuICAgKi9cbiAgZ2V0TGF5b3V0SXRlbXMoY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxhbnk+W10sIHVpRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgYW55Pik6IEZpZWxkRGVmaW5pdGlvbjxhbnk+W10ge1xuICAgIHJldHVybiBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICBsZXQgdXBkYXRlZENoaWxkID0gY2hpbGQ7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB1aURlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHVpRGVjb3JhdG9yc1trZXldO1xuICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiBkZWNzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGVjLmtleSA9PT0gVUlLZXlzLlVJTEFZT1VUSVRFTSAmJlxuICAgICAgICAgICAgKGRlYy5wcm9wcz8ubmFtZSA9PT0gY2hpbGQucHJvcHM/Lm5hbWUgfHwgZGVjLnByb3BzPy5uYW1lID09PSBjaGlsZC5wcm9wcz8uY2hpbGRPZilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29sLCBwcm9wcywgcm93IH0gPSBkZWMucHJvcHMgYXMgVUlMYXlvdXRJdGVtTWV0YWRhdGE7XG4gICAgICAgICAgICB1cGRhdGVkQ2hpbGQgPSB7XG4gICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAuLi5jaGlsZC5wcm9wcyxcbiAgICAgICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVkQ2hpbGQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgYSBtb2RlbCB3aXRoIGdsb2JhbCBwcm9wZXJ0aWVzIGFuZCBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gZGVmaW5lIHNwZWNpZmljIHJlbmRlcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFIgUmVuZGVyaW5nIGVuZ2luZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBvdXRwdXQgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGJlIHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBnbG9iYWxQcm9wcyAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIGVsZW1lbnRzIGR1cmluZyByZW5kZXJpbmcuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IG1heSBiZSByZXF1aXJlZCBmb3Igc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAgICogQHJldHVybnMge1J9IFRoZSByZW5kZXJlZCByZXN1bHQsIHR5cGUgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgYWJzdHJhY3QgcmVuZGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgZ2xvYmFsUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBZGRzIGEgcmVuZGVyaW5nIGVuZ2luZSB0byB0aGUgc3RhdGljIGNhY2hlIGFuZCBzZXRzIGl0IGFzIHRoZSBjdXJyZW50IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj59IGVuZ2luZSAtIFRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJlZ2lzdGVyLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhbiBlbmdpbmUgd2l0aCB0aGUgc2FtZSBmbGF2b3IgYWxyZWFkeSBleGlzdHMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihlbmdpbmU6IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPikge1xuICAgIGlmIChlbmdpbmUuZmxhdm91ciBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBSZW5kZXJpbmcgZW5naW5lIHVuZGVyICR7ZW5naW5lLmZsYXZvdXJ9IGFscmVhZHkgZXhpc3RzYFxuICAgICAgKTtcbiAgICB0aGlzLmNhY2hlW2VuZ2luZS5mbGF2b3VyXSA9IGVuZ2luZTtcbiAgICB0aGlzLmN1cnJlbnQgPSBlbmdpbmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBpbml0aWFsaXplcyBhIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYW4gZXhpc3RpbmcgZW5naW5lIGluc3RhbmNlIG9yIGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgbmV3IG9uZSBpZiBnaXZlbiBhIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTyBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSBvdXRwdXRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+fSBvYmogLSBUaGUgZW5naW5lIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJucyB7UmVuZGVyaW5nRW5naW5lPE8+fSBUaGUgaW5pdGlhbGl6ZWQgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3JCb290PE8+KFxuICAgIG9iajogQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICApOiBSZW5kZXJpbmdFbmdpbmU8Tz4ge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZW5kZXJpbmdFbmdpbmUpIHJldHVybiBvYmogYXMgUmVuZGVyaW5nRW5naW5lPE8+O1xuICAgIGNvbnN0IGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPE8+ID0gbmV3IG9iaigpO1xuICAgIGVuZ2luZS5pbml0aWFsaXplKCk7IC8vIG1ha2UgdGhlIGJvb3RpbmcgYXN5bmMuIHVzZSB0aGUgaW5pdGlhbGl6ZWQgZmxhZyB0byBjb250cm9sIGl0XG4gICAgcmV0dXJuIGVuZ2luZSBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlbmRlcmluZyBlbmdpbmUgYnkgZmxhdm9yLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBjdXJyZW50IHJlbmRlcmluZyBlbmdpbmUgb3IgYSBzcGVjaWZpYyBvbmUgYnkgZmxhdm9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTyBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSBvdXRwdXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSAtIFRoZSBmbGF2b3Igb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSByZXF1ZXN0ZWQgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIHJlcXVlc3RlZCBmbGF2b3IgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXQ8Tz4oZmxhdm91cj86IHN0cmluZyk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgICB0aGlzLmN1cnJlbnQgYXMgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICAgICAgKTtcbiAgICBpZiAoIShmbGF2b3VyIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBSZW5kZXJpbmcgZW5naW5lIHVuZGVyICR7Zmxhdm91cn0gZG9lcyBub3QgZXhpc3RgXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmdldE9yQm9vdDxPPihcbiAgICAgIHRoaXMuY2FjaGVbZmxhdm91cl0gYXNcbiAgICAgICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+XG4gICAgICAgIHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBjb3JyZWN0IHJlbmRlcmluZyBlbmdpbmUgZm9yIGEgbW9kZWwgYW5kIGludm9rZXMgaXRzIHJlbmRlciBtZXRob2QuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcmVuZGVyIG1ldGhvZC5cbiAgICogQHJldHVybnMge2FueX0gVGhlIHJlc3VsdCBvZiB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlZ2lzdGVyZWQgbW9kZWwgaXMgZm91bmQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID1cbiAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSB8fCBNb2RlbC5mcm9tT2JqZWN0KG1vZGVsKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIG1vZGVsIHJlZ2lzdGVyZWQgZm91bmRcIik7XG4gICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5SRU5ERVJFRF9CWSksXG4gICAgICBjb25zdHJ1Y3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPlxuICAgICk7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZvciB0aGUgdmFyIGFyZ3MgdHlwZSBjaGVja1xuICAgIHJldHVybiBSZW5kZXJpbmdFbmdpbmUuZ2V0KGZsYXZvdXIpLnJlbmRlcihtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIG1ldGFkYXRhIGtleSBmb3IgVUktcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBQcmVmaXhlcyBhIGdpdmVuIGtleSB3aXRoIHRoZSBVSSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcHJlZml4LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJlZml4ZWQga2V5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7VUlLZXlzLlJFRkxFQ1R9JHtrZXl9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4uL3VpL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFbmdpbmUgfSBmcm9tIFwiLi4vdWkvUmVuZGVyaW5nXCI7XG5pbXBvcnQgeyBVSUxpc3RJdGVtTW9kZWxNZXRhZGF0YSwgVUlNZWRpYUJyZWFrUG9pbnRzLCBVSU1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiLi4vdWkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgdGFncyBhIGNsYXNzIGFzIGEgVUkgbW9kZWxcbiAqIEBzdW1tYXJ5IEFkZHMgcmVuZGVyaW5nIGNhcGFiaWxpdGllcyB0byBhIG1vZGVsIGNsYXNzIGJ5IHByb3ZpZGluZyBhIHJlbmRlciBtZXRob2RcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIGNsYXNzIHRoYXQgZW5hYmxlcyBpdCB0byBiZSByZW5kZXJlZCBieSB0aGUgVUkgcmVuZGVyaW5nIGVuZ2luZS5cbiAqIFRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcgYW5kIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIFRoZSBIVE1MIHRhZyB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBtb2RlbCAoZGVmYXVsdHMgdG8gY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgcmVuZGVyZWQgZWxlbWVudFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbW9kZWxcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCB0YWcgKGNsYXNzIG5hbWUpXG4gKiBAdWltb2RlbCgpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICpcbiAqIC8vIFVzYWdlIHdpdGggY3VzdG9tIHRhZyBhbmQgcHJvcGVydGllc1xuICogQHVpbW9kZWwoJ2RpdicsIHsgY2xhc3M6ICd1c2VyLWNhcmQnIH0pXG4gKiBjbGFzcyBVc2VyQ2FyZCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBjb25zdHJ1Y3RvclxuICogICBwYXJ0aWNpcGFudCBpbnN0YW5jZVxuICogICBTeXN0ZW0tPj51aW1vZGVsOmRvKGNvbnN0cnVjdG9yKVxuICogICB1aW1vZGVsLT4+Y29uc3RydWN0b3I6IEV4ZWN1dGVzIHRoZSBjb25zdHJ1Y3RvclxuICogICBjb25zdHJ1Y3Rvci0+PnVpbW9kZWw6IHJldHVybnMgaW5zdGFuY2VcbiAqICAgdWltb2RlbC0+Pmluc3RhbmNlOiBhZGRzIHRoZSByZW5kZXIgbWV0aG9kXG4gKiAgIHVpbW9kZWwtPj5TeXN0ZW06IHJldHVybnMgVUlNb2RlbCBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWltb2RlbCh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSU1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyB8fCBvcmlnaW5hbC5uYW1lLFxuICAgICAgcHJvcHM6IHByb3BzLFxuICAgIH07XG4gICAgcmV0dXJuIG1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLCBtZXRhKShvcmlnaW5hbCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNwZWNpZmllcyB3aGljaCByZW5kZXJpbmcgZW5naW5lIHRvIHVzZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgQXNzb2NpYXRlcyBhIG1vZGVsIHdpdGggYSBzcGVjaWZpYyByZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBlbmdpbmUgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3MsXG4gKiBlbmFibGluZyBkaWZmZXJlbnQgcmVuZGVyaW5nIHN0cmF0ZWdpZXMgZm9yIGRpZmZlcmVudCBtb2RlbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuZ2luZSBUaGUgbmFtZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byB1c2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiByZW5kZXJlZEJ5XG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTcGVjaWZ5IGEgY3VzdG9tIHJlbmRlcmluZyBlbmdpbmUgZm9yIGEgbW9kZWxcbiAqIEB1aW1vZGVsKClcbiAqIEByZW5kZXJlZEJ5KCdyZWFjdCcpXG4gKiBjbGFzcyBSZWFjdENvbXBvbmVudCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgcmVuZGVyZWRCeVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+cmVuZGVyZWRCeTogYXBwbHkgdG8gTW9kZWxcbiAqICAgcmVuZGVyZWRCeS0+Pk1vZGVsOiBhZGRzIGVuZ2luZSBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogdXNlcyBzcGVjaWZpZWQgZW5naW5lXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlN5c3RlbTogcmVuZGVycyB3aXRoIGN1c3RvbSBlbmdpbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcmVkQnkoZW5naW5lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlJFTkRFUkVEX0JZKSwgZW5naW5lKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHRhZ3MgYSBtb2RlbCBhcyBhIGxpc3QgaXRlbSBmb3IgVUkgcmVuZGVyaW5nXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgbW9kZWwgc2hvdWxkIGJlIHJlbmRlcmVkIHdoZW4gZGlzcGxheWVkIGluIGEgbGlzdCBjb250ZXh0XG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBjbGFzcyB0aGF0IGVuYWJsZXMgaXQgdG8gYmUgcmVuZGVyZWQgYXMgYSBsaXN0IGl0ZW1cbiAqIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLiBUaGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiB3aGVuIGl0IGFwcGVhcnMgaW4gYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgSFRNTCB0YWcgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgbW9kZWwgYXMgYSBsaXN0IGl0ZW0gKGRlZmF1bHRzIHRvIGNsYXNzIG5hbWUpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGxpc3QgaXRlbSBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0aXRlbVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3RpdGVtKClcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgpXG4gKiBAdWlsaXN0aXRlbSgnbGknLCB7IGNsYXNzOiAnbGlzdC1ncm91cC1pdGVtJyB9KVxuICogY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsaXN0aXRlbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+dWlsaXN0aXRlbTogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWlsaXN0aXRlbS0+Pk1vZGVsOiBhZGRzIGxpc3QgaXRlbSBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogdXNlcyBsaXN0IGl0ZW0gbWV0YWRhdGEgd2hlbiBpbiBsaXN0IGNvbnRleHRcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggbGlzdCBpdGVtIHN0eWxpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdGl0ZW0odGFnPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YTogVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICBpdGVtOiB7XG4gICAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICAgIHByb3BzOiBwcm9wcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUSVRFTSksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgYWRkcyBldmVudCBoYW5kbGVycyB0byBhIFVJIG1vZGVsXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgZXZlbnQgaGFuZGxlcnMgdGhhdCBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIG1vZGVsXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBldmVudCBoYW5kbGVycyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIFVJIGVsZW1lbnQuIFRoZSBoYW5kbGVycyBhcmUgcGFzc2VkIGFzIHByb3BlcnRpZXNcbiAqIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBPYmplY3QgY29udGFpbmluZyBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgb3RoZXIgcHJvcGVydGllc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpaGFuZGxlcnNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCBldmVudCBoYW5kbGVycyB0byBhIG1vZGVsXG4gKiBAdWltb2RlbCgnYnV0dG9uJylcbiAqIEB1aWhhbmRsZXJzKHtcbiAqICAgb25DbGljazogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQnKSxcbiAqICAgb25Nb3VzZU92ZXI6IChldmVudCkgPT4gY29uc29sZS5sb2coJ01vdXNlIG92ZXIgYnV0dG9uJyksXG4gKiAgIGRpc2FibGVkOiBmYWxzZVxuICogfSlcbiAqIGNsYXNzIENsaWNrYWJsZUJ1dHRvbiBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGxhYmVsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQWRkIGZvcm0gc3VibWlzc2lvbiBoYW5kbGVyc1xuICogQHVpbW9kZWwoJ2Zvcm0nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvblN1Ym1pdDogKGV2ZW50KSA9PiB7XG4gKiAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAqICAgICBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQnKTtcbiAqICAgfSxcbiAqICAgb25SZXNldDogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnRm9ybSByZXNldCcpXG4gKiB9KVxuICogY2xhc3MgQ29udGFjdEZvcm0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpaGFuZGxlcnNcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIFN5c3RlbS0+PnVpaGFuZGxlcnM6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpaGFuZGxlcnMtPj5Nb2RlbDogYWRkcyBoYW5kbGVyIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgd2l0aCBoYW5kbGVyc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogcmVuZGVycyBlbGVtZW50IHdpdGggZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWRcbiAqICAgVUktPj5Nb2RlbDogdHJpZ2dlcnMgaGFuZGxlcnMgb24gZXZlbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWhhbmRsZXJzKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhID0ge1xuICAgICAgaGFuZGxlcnM6IHByb3BzXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLCBtZXRhKShvcmlnaW5hbCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGNyZWF0ZXMgYSBsYXlvdXQgY29udGFpbmVyIHdpdGggZ3JpZCBzcGVjaWZpY2F0aW9uc1xuICogQHN1bW1hcnkgQ29tYmluZXMgVUkgbW9kZWwgZnVuY3Rpb25hbGl0eSB3aXRoIGxheW91dCBncmlkIGNvbmZpZ3VyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNyZWF0ZXMgYSBVSSBtb2RlbCB0aGF0IGFjdHMgYXMgYSBsYXlvdXQgY29udGFpbmVyIHdpdGggc3BlY2lmaWVkXG4gKiBjb2x1bW4gYW5kIHJvdyBjb25maWd1cmF0aW9ucy4gSXQncyBhIGNvbnZlbmllbmNlIGRlY29yYXRvciB0aGF0IGNvbWJpbmVzXG4gKiBAdWltb2RlbCB3aXRoIGxheW91dC1zcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciByZXNwb25zaXZlIGdyaWQgbGF5b3V0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIHRhZyB0byB1c2UgZm9yIHRoZSBsYXlvdXQgY29udGFpbmVyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbHM9MV0gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQgbGF5b3V0XG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmdbXX0gW3Jvd3M9MV0gTnVtYmVyIG9mIHJvd3Mgb3IgYXJyYXkgb2Ygcm93IGRlZmluaXRpb25zXG4gKiBAcGFyYW0ge1VJTWVkaWFCcmVha1BvaW50c30gW2JyZWFrcG9pbnQ9J20nXSBNZWRpYSBicmVha3BvaW50IGZvciByZXNwb25zaXZlIGJlaGF2aW9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSAyLWNvbHVtbiBsYXlvdXRcbiAqIEB1aWxheW91dCgnZGl2JywgMiwgMylcbiAqIGNsYXNzIFR3b0NvbHVtbkxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMSlcbiAqICAgaGVhZGVyOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAyKVxuICogICBsZWZ0Q29udGVudDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMiwgMilcbiAqICAgcmlnaHRDb250ZW50OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVzcG9uc2l2ZSBsYXlvdXQgd2l0aCBjdXN0b20gYnJlYWtwb2ludFxuICogQHVpbGF5b3V0KCdzZWN0aW9uJywgMywgMiwgJ2wnKVxuICogY2xhc3MgUmVzcG9uc2l2ZUxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMSlcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDIsIDEpXG4gKiAgIHN1YnRpdGxlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsYXlvdXRcbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+dWlsYXlvdXQ6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpbGF5b3V0LT4+dWltb2RlbDogY2FsbCB3aXRoIGxheW91dCBwcm9wc1xuICogICB1aW1vZGVsLT4+TW9kZWw6IGFkZHMgbW9kZWwgbWV0YWRhdGEgd2l0aCBsYXlvdXQgY29uZmlnXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgYXMgbGF5b3V0IGNvbnRhaW5lclxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgZ3JpZCBsYXlvdXQgd2l0aCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsYXlvdXQodGFnOiBzdHJpbmcsIGNvbHM6IG51bWJlciA9IDEsIHJvd3M6IG51bWJlciB8IHN0cmluZ1tdID0gMSwgYnJlYWtwb2ludDogVUlNZWRpYUJyZWFrUG9pbnRzID0gJ20nKSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICByZXR1cm4gdWltb2RlbCh0YWcsIHtjb2xzLCByb3dzLCBicmVha3BvaW50fSkob3JpZ2luYWwsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn0iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgdGhhdCBleHRlbmRzIHRoZSBNb2RlbCBwcm90b3R5cGUgd2l0aCByZW5kZXJpbmcgY2FwYWJpbGl0aWVzXG4gKiBAc3VtbWFyeSBBZGRzIHRoZSByZW5kZXIgbWV0aG9kIHRvIGFsbCBNb2RlbCBpbnN0YW5jZXMgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIHRoZSBNb2RlbCBjbGFzcyBieSBhZGRpbmcgYSByZW5kZXIgbWV0aG9kXG4gKiB0byBpdHMgcHJvdG90eXBlLiBUaGlzIGFsbG93cyBhbnkgTW9kZWwgaW5zdGFuY2UgdG8gYmUgcmVuZGVyZWQgdXNpbmcgdGhlIFJlbmRlcmluZ0VuZ2luZS5cbiAqIEBtb2R1bGUgbW9kZWwvb3ZlcnJpZGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvbW9kZWxcbiAqL1xuXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuLi91aS9SZW5kZXJpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVuZGVycyB0aGUgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmVcbiAqIEBzdW1tYXJ5IERlbGVnYXRlcyByZW5kZXJpbmcgdG8gdGhlIFJlbmRlcmluZ0VuZ2luZSBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YVxuICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgcmVuZGVyIG1ldGhvZCBmcm9tIHRoZSBSZW5kZXJhYmxlIGludGVyZmFjZSBmb3IgYWxsIE1vZGVsIGluc3RhbmNlcy5cbiAqIEl0IHVzZXMgdGhlIFJlbmRlcmluZ0VuZ2luZSB0byBkZXRlcm1pbmUgaG93IHRvIHJlbmRlciB0aGUgbW9kZWwgYmFzZWQgb24gaXRzIG1ldGFkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgb2YgdGhlIG1vZGVsIGJlaW5nIHJlbmRlcmVkXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqIEByZXR1cm4ge2FueX0gVGhlIHJlbmRlcmVkIG91dHB1dCBpbiB0aGUgZm9ybWF0IGRldGVybWluZWQgYnkgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqL1xuTW9kZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE0sIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBSZW5kZXJpbmdFbmdpbmUucmVuZGVyKHRoaXMsIC4uLmFyZ3MpO1xufTtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbktleXMsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxheW91dEl0ZW1NZXRhZGF0YSxcbiAgVUlMaXN0UHJvcE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGR1cmluZyBzcGVjaWZpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRyb2xzIHByb3BlcnR5IHZpc2liaWxpdHkgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBDUlVEIG9wZXJhdGlvbnMgc2hvdWxkIGhpZGUgYSBwcm9wZXJ0eVxuICogaW4gdGhlIFVJLiBUaGUgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHZpc2libGUgZHVyaW5nIG9wZXJhdGlvbnMgbm90IHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9ucyAtIFRoZSBDUlVEIG9wZXJhdGlvbnMgZHVyaW5nIHdoaWNoIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZU9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIaWRlIHRoZSBwYXNzd29yZCBmaWVsZCBkdXJpbmcgUkVBRCBvcGVyYXRpb25zXG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGVPbihPcGVyYXRpb25LZXlzLlJFQUQpXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+aGlkZU9uOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGhpZGRlbiBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgb3IgaGlkZSBiYXNlZCBvbiBjdXJyZW50IG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uKC4uLm9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25LZXlzW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxDcnVkT3BlcmF0aW9uS2V5c1tdPihcbiAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5ISURERU4pLFxuICAgIG9wZXJhdGlvbnNcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY29tcGxldGVseSBoaWRlcyBhIHByb3BlcnR5IGluIGFsbCBVSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBNYWtlcyBhIHByb3BlcnR5IGludmlzaWJsZSBpbiBhbGwgQ1JVRCBvcGVyYXRpb25zXG4gKiBUaGlzIGRlY29yYXRvciBpcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIGhpZGVPbiB0aGF0IGhpZGVzIGEgcHJvcGVydHlcbiAqIGR1cmluZyBhbGwgQ1JVRCBvcGVyYXRpb25zIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZGVuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb21wbGV0ZWx5IGhpZGUgdGhlIGludGVybmFsSWQgZmllbGQgaW4gdGhlIFVJXG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAaGlkZGVuKClcbiAqICAgaW50ZXJuYWxJZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZGVuXG4gKiAgIHBhcnRpY2lwYW50IGhpZGVPblxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgTW9kZWwtPj5oaWRkZW46IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIGhpZGRlbi0+PmhpZGVPbjogQ2FsbCB3aXRoIGFsbCBvcGVyYXRpb25zXG4gKiAgIGhpZGVPbi0+Pk1vZGVsOiBBZGQgaGlkZGVuIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBDaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gYWxsIG9wZXJhdGlvbnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IEFsd2F5cyBoaWRlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW4oKSB7XG4gIHJldHVybiBoaWRlT24oXG4gICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIE9wZXJhdGlvbktleXMuREVMRVRFXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBVSSBlbGVtZW50XG4gKiBAc3VtbWFyeSBNYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBVSSBlbGVtZW50IHdpdGggY3VzdG9tIHByb3BlcnRpZXNcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHdoaWNoIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWRcbiAqIHRvIHJlbmRlciBhIHNwZWNpZmljIHByb3BlcnR5LCBhbG9uZyB3aXRoIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGF0IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byB1c2UgZm9yIHJlbmRlcmluZ1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWllbGVtZW50XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZW5kZXIgYSBwcm9wZXJ0eSBhcyBhIHRleHQgaW5wdXRcbiAqIGNsYXNzIExvZ2luRm9ybSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3RleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHVzZXJuYW1lJyB9KVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAncGFzc3dvcmQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhc3N3b3JkJyB9KVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2J1dHRvbicsIHsgY2xhc3M6ICdidG4tcHJpbWFyeScgfSlcbiAqICAgc3VibWl0OiBzdHJpbmcgPSAnTG9naW4nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWllbGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PnVpZWxlbWVudDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWllbGVtZW50LT4+TW9kZWw6IEFkZCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgZWxlbWVudCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHRhZyBhbmQgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IFJlbmRlciB3aXRoIHNwZWNpZmllZCBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWVsZW1lbnQoXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5FTEVNRU5UKSwgbWV0YWRhdGEpKFxuICAgICAgb3JpZ2luYWwsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSBwYXNzZWQgdG8gYSBVSSBjb21wb25lbnRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IHNob3VsZCBiZSBtYXBwZWQgdG9cbiAqIGEgcHJvcGVydHkgb2YgdGhlIFVJIGNvbXBvbmVudCB3aGVuIHJlbmRlcmluZy4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlXG4gKiBkZWNvcmF0ZWQgd2l0aCBAdWltb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtib29sZWFufSBbc3RyaW5naWZ5PWZhbHNlXSBXaGV0aGVyIHRvIHN0cmluZ2lmeSB0aGUgcHJvcGVydHkgdmFsdWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBtb2RlbCBwcm9wZXJ0aWVzIHRvIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAnZnVsbE5hbWUnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZnVsbE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRW1haWwnKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAndXNlckVtYWlsJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckRhdGEnLCB0cnVlKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyBzdHJpbmdpZmllZCBKU09OXG4gKiAgIHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcHJvcC0+Pk1vZGVsOiBBZGQgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIHN0cmluZ2lmeSBmbGFnXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSVByb3BNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnksXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG5lc3RlZCBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGEgcGFyZW50IGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIHRoZSBjaGlsZCBtb2RlbCB3aGVuIG5lc3RlZC5cbiAqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIGRlY29yYXRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmVzdGVkIG1vZGVscy5cbiAqIFdoZW4gYXBwbGllZCwgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgdGFnIG9mIHRoZSBjaGlsZCBtb2RlbCB3aXRoIHRoZSBwcm92aWRlZCBvbmUsXG4gKiBlbmFibGluZyBkaWZmZXJlbnQgcmVuZGVyaW5nIGJlaGF2aW9yIHdoZW4gdGhlIG1vZGVsIGFjdHMgYXMgYSBjaGlsZCAobmVzdGVkKVxuICogY29tcGFyZWQgdG8gd2hlbiBpdCBpcyByZW5kZXJlZCBhcyB0aGUgcGFyZW50IG1vZGVsLlxuICpcbiAqIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBgQHVpbW9kZWxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiBUaGUgbW9kZWwgY2xhc3MgbmFtZSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byBvdmVycmlkZSB0aGUgVUkgdGFnIG9mIHRoZSBuZXN0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiB1aWNoaWxkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgYSBuZXN0ZWQgbW9kZWwgdG8gYSBjb21wb25lbnQgcHJvcGVydHkgd2l0aCBhIGRpZmZlcmVudCB0YWcgd2hlbiBuZXN0ZWRcbiAqIEB1aW1vZGVsKCdhZGRyZXNzLWNvbXBvbmVudCcpXG4gKiBjbGFzcyBBZGRyZXNzIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHN0cmVldDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNpdHk6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWNoaWxkKEFkZHJlc3MubmFtZSwgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50JylcbiAqICAgYWRkcmVzczogQWRkcmVzcztcbiAqIH1cbiAqXG4gKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBBZGRyZXNzIG1vZGVsIGhhcyB0aGUgZGVmYXVsdCB0YWcgJ2FkZHJlc3MtY29tcG9uZW50JyB3aGVuIHJlbmRlcmVkIGFzIGEgcm9vdCBjb21wb25lbnQsXG4gKiAvLyBidXQgd2hlbiB1c2VkIGluc2lkZSBVc2VyUHJvZmlsZSwgaXQgaXMgcmVuZGVyZWQgd2l0aCB0aGUgb3ZlcnJpZGRlbiB0YWcgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50J1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWljaGlsZFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWljaGlsZDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWljaGlsZC0+Pk1vZGVsOiBBZGQgY2hpbGQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBjaGlsZCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSwgc3RyaW5naWZ5IGZsYWcsIGFuZCBjaGlsZCB0YWcgb3ZlcnJpZGVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWUgYW5kIHJlbmRlciB3aXRoIG92ZXJyaWRkZW4gdGFnIGlmIG5lc3RlZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1aWNoaWxkKFxuICBjbGF6ejogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgaXNBcnJheTogYm9vbGVhbiA9IGZhbHNlLFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlFbGVtZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IGNsYXp6IHx8IHByb3BlcnR5S2V5LFxuICAgICAgfSwgaXNBcnJheSA/IHtjdXN0b21UeXBlczogW0FycmF5Lm5hbWVdLCBtdWx0aXBsZTogdHJ1ZX0gOiB7bXVsdGlwbGU6IGZhbHNlfSksXG4gICAgfTtcblxuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5DSElMRCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgbGlzdCBpdGVtIGNvbXBvbmVudFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBpbiBhIGxpc3QgY29udGV4dFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgY29udGFpbmluZyBhIGxpc3RcbiAqIHNob3VsZCBiZSByZW5kZXJlZC4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIEB1aWxpc3RpdGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbGlzdCBjb250YWluZXJcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3Rwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYSBsaXN0IHByb3BlcnR5IHdpdGggY3VzdG9tIHJlbmRlcmluZ1xuICogQHVpbW9kZWwoJ3RvZG8tbGlzdCcpXG4gKiBjbGFzcyBUb2RvTGlzdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxpc3Rwcm9wKCdpdGVtcycsIHsgY2xhc3M6ICd0b2RvLWl0ZW1zLWNvbnRhaW5lcicgfSlcbiAqICAgaXRlbXM6IFRvZG9JdGVtW107XG4gKiB9XG4gKlxuICogQHVpbGlzdGl0ZW0oJ2xpJywgeyBjbGFzczogJ3RvZG8taXRlbScgfSlcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExpc3RDb250YWluZXJcbiAqICAgcGFydGljaXBhbnQgTGlzdEl0ZW1zXG4gKiAgIE1vZGVsLT4+dWlsaXN0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsaXN0cHJvcC0+Pk1vZGVsOiBBZGQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBjb250YWluZXIgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdENvbnRhaW5lcjogQ3JlYXRlIGNvbnRhaW5lciB3aXRoIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RJdGVtczogUmVuZGVyIGVhY2ggaXRlbSB1c2luZyBAdWlsaXN0aXRlbVxuICogICBMaXN0Q29udGFpbmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcmVuZGVyZWQgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0cHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFVJTGlzdFByb3BNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHByb3BzOiBwcm9wcyB8fCB7fSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBwb3NpdGlvbnMgYSBwcm9wZXJ0eSBpbiBhIHNwZWNpZmljIGdyaWQgbGF5b3V0IHBvc2l0aW9uXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbHVtbiBhbmQgcm93IHBvc2l0aW9uIGZvciBhIHByb3BlcnR5IGluIGEgVUkgbGF5b3V0IGdyaWRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHRoZSBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIHByb3BlcnR5IHdpdGhpblxuICogYSBncmlkLWJhc2VkIGxheW91dCBzeXN0ZW0uIEl0IHNwZWNpZmllcyB3aGljaCBjb2x1bW4gYW5kIHJvdyB0aGUgcHJvcGVydHlcbiAqIHNob3VsZCBvY2N1cHkgd2hlbiByZW5kZXJlZCBpbiB0aGUgVUkuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbCBUaGUgY29sdW1uIHBvc2l0aW9uIGluIHRoZSBncmlkIGxheW91dFxuICogQHBhcmFtIHtudW1iZXJ9IFtyb3c9MV0gVGhlIHJvdyBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXQgKGRlZmF1bHRzIHRvIDEpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wcz17fV0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxheW91dCBpdGVtXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRpdGVtXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQb3NpdGlvbiBwcm9wZXJ0aWVzIGluIGEgZ3JpZCBsYXlvdXRcbiAqIEB1aW1vZGVsKCd1c2VyLWZvcm0nKVxuICogY2xhc3MgVXNlckZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKSAvLyBGaXJzdCBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBmaXJzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDIsIDEpIC8vIFNlY29uZCBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBsYXN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMiwgeyBjb2xzcGFuOiAyIH0pIC8vIEZpcnN0IGNvbHVtbiwgc2Vjb25kIHJvdywgc3BhbnMgMiBjb2x1bW5zXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAzLCB7IGNsYXNzOiAnZnVsbC13aWR0aCcgfSkgLy8gRmlyc3QgY29sdW1uLCB0aGlyZCByb3cgd2l0aCBjdXN0b20gY2xhc3NcbiAqICAgYmlvOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dGl0ZW1cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExheW91dENvbnRhaW5lclxuICogICBNb2RlbC0+PnVpbGF5b3V0aXRlbTogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsYXlvdXRpdGVtLT4+TW9kZWw6IEFkZCBsYXlvdXQgaXRlbSBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gY29sdW1uLCByb3csIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MYXlvdXRDb250YWluZXI6IFBvc2l0aW9uIGVsZW1lbnQgYXQgZ3JpZCBjb29yZGluYXRlc1xuICogICBMYXlvdXRDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwb3NpdGlvbmVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGF5b3V0aXRlbShcbiAgY29sOiBudW1iZXIsXG4gIHJvdzogbnVtYmVyID0gMSxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJTGF5b3V0SXRlbU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogIHByb3BlcnR5S2V5LFxuICAgICAgY29sLFxuICAgICAgcm93LFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSxcbiAgICB9OyAgXG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTEFZT1VUSVRFTSksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENsYXNzIHJlcHJlc2VudGluZyBhbiBldmVudCBoYW5kbGVyXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIGV2ZW50cyBpbiB0aGUgVUkgZGVjb3JhdG9ycyBzeXN0ZW1cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBtYW5hZ2luZyBhbmQgcHJvY2Vzc2luZyBldmVudHMgdGhhdCBvY2N1clxuICogd2l0aGluIHRoZSBVSSBjb21wb25lbnRzIGdlbmVyYXRlZCBieSB0aGUgZGVjb3JhdG9ycy5cbiAqIEBjbGFzcyBFdmVudEhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy91aVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEV2ZW50SGFuZGxlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBFdmVudEhhbmRsZXIgb2JqZWN0XG4gICAqIFRoaXMgY29uc3RydWN0b3IgY3VycmVudGx5IGRvZXNuJ3QgdGFrZSBhbnkgcGFyYW1ldGVycywgYnV0IGl0IGNhbiBiZVxuICAgKiBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGFjY2VwdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaWYgbmVlZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxufSIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFVJIGRlY29yYXRvcnMgbW9kdWxlIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgYnVpbGRpbmcgVUkgY29tcG9uZW50cyBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIGJvdGggdGhlIG1vZGVsIGFuZCBVSSBzdWJtb2R1bGVzLCBwcm92aWRpbmcgZGVjb3JhdG9ycyBmb3JcbiAqIHJlbmRlcmluZywgY29tcG9uZW50IGRlZmluaXRpb24sIGFuZCBVSSBzdGF0ZSBtYW5hZ2VtZW50LlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VpXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBmb3IgcmVmZXJlbmNlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIk1vZGVsS2V5cyIsIlZhbGlkYXRpb25LZXlzIiwiRW1haWxWYWxpZGF0b3IiLCJVUkxWYWxpZGF0b3IiLCJEYXRlVmFsaWRhdG9yIiwiUGFzc3dvcmRWYWxpZGF0b3IiLCJSZXF1aXJlZFZhbGlkYXRvciIsIk1pblZhbGlkYXRvciIsIk1heFZhbGlkYXRvciIsIlN0ZXBWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJQYXR0ZXJuVmFsaWRhdG9yIiwiRXF1YWxzVmFsaWRhdG9yIiwiRGlmZlZhbGlkYXRvciIsIkxlc3NUaGFuVmFsaWRhdG9yIiwiTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5WYWxpZGF0b3IiLCJHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJCYXNlRXJyb3IiLCJmb3JtYXREYXRlIiwiUmVzZXJ2ZWRNb2RlbHMiLCJwYXJzZURhdGUiLCJJbnRlcm5hbEVycm9yIiwiZmluZE1vZGVsSWQiLCJNb2RlbCIsIlJlZmxlY3Rpb24iLCJtZXRhZGF0YSIsImFwcGx5IiwicHJvcE1ldGFkYXRhIiwiT3BlcmF0aW9uS2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7Ozs7SUFPRztJQTBCSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE0Q0c7QUFDVSxVQUFBLE1BQU0sR0FBRztJQUNwQixJQUFB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
1529
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy91aS9jb25zdGFudHMudHMiLCIuLi9zcmMvdWkvZXJyb3JzLnRzIiwiLi4vc3JjL3VpL3V0aWxzLnRzIiwiLi4vc3JjL3VpL1JlbmRlcmluZy50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL292ZXJyaWRlcy50cyIsIi4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3VpL2hhbmRsZXJzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyBhbmQgZW51bXMgZm9yIFVJIHJlbmRlcmluZyBhbmQgdmFsaWRhdGlvblxuICogQHN1bW1hcnkgRGVmaW5lcyBrZXlzLCBtYXBwaW5ncywgYW5kIEhUTUw1IGlucHV0IHR5cGVzIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBVSSBkZWNvcmF0b3JzIGxpYnJhcnkgZm9yXG4gKiByZW5kZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBIVE1MIGVsZW1lbnQgZ2VuZXJhdGlvbi5cbiAqIEBtb2R1bGUgdWkvY29uc3RhbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGF0ZVZhbGlkYXRvcixcbiAgRGlmZlZhbGlkYXRvcixcbiAgRW1haWxWYWxpZGF0b3IsXG4gIEVxdWFsc1ZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBHcmVhdGVyVGhhblZhbGlkYXRvcixcbiAgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBMZXNzVGhhblZhbGlkYXRvcixcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yLFxuICBNYXhWYWxpZGF0b3IsXG4gIE1pbkxlbmd0aFZhbGlkYXRvcixcbiAgTWluVmFsaWRhdG9yLFxuICBNb2RlbEtleXMsXG4gIFBhc3N3b3JkVmFsaWRhdG9yLFxuICBQYXR0ZXJuVmFsaWRhdG9yLFxuICBSZXF1aXJlZFZhbGlkYXRvcixcbiAgU3RlcFZhbGlkYXRvcixcbiAgVVJMVmFsaWRhdG9yLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBmb3IgVUkgbWV0YWRhdGEgYW5kIHJlbmRlcmluZ1xuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYXMga2V5cyBmb3IgVUktcmVsYXRlZCBtZXRhZGF0YVxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSByZWxhdGVkIHRvXG4gKiBVSSBtb2RlbHMsIGVsZW1lbnRzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsaWRhdGlvbiBydWxlcy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVSUtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEJhc2UgcmVmbGVjdGlvbiBrZXkgZm9yIFVJIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlNT0RFTCAtIEtleSBmb3IgVUkgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVJFRF9CWSAtIEtleSBmb3Igc3BlY2lmeWluZyByZW5kZXJpbmcgZW5naW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRUxFTUVOVCAtIEtleSBmb3IgZWxlbWVudCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBST1AgLSBLZXkgZm9yIHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRSAtIEtleSBmb3IgbmFtZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOQU1FX1BSRUZJWCAtIFByZWZpeCBmb3IgaW5wdXQgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDVVNUT01fUFJPUFMgLSBLZXkgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RJVEVNIC0gS2V5IGZvciBsaXN0IGl0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RQUk9QIC0gS2V5IGZvciBsaXN0IHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSAtIEtleSBmb3IgdHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQl9UWVBFIC0gS2V5IGZvciBzdWJ0eXBlIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gS2V5IGZvciBoaWRkZW4gYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRk9STUFUIC0gS2V5IGZvciBmb3JtYXQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFEX09OTFkgLSBLZXkgZm9yIHJlYWRvbmx5IGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIC0gS2V5IGZvciByZXF1aXJlZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIC0gS2V5IGZvciBtaW5pbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIC0gS2V5IGZvciBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIC0gS2V5IGZvciBtYXhpbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVhfTEVOR1RIIC0gS2V5IGZvciBtYXhpbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiAtIEtleSBmb3IgcGF0dGVybiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gS2V5IGZvciBVUkwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgLSBLZXkgZm9yIHN0ZXAgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBLZXkgZm9yIGRhdGUgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gS2V5IGZvciBlbWFpbCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBLZXkgZm9yIHBhc3N3b3JkIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTFMgLSBLZXkgZm9yIGVxdWFsaXR5IHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGIC0gS2V5IGZvciBkaWZmZXJlbmNlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMRVNTX1RIQU4gLSBLZXkgZm9yIGxlc3MgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOX09SX0VRVUFMIC0gS2V5IGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEdSRUFURVJfVEhBTiAtIEtleSBmb3IgZ3JlYXRlciB0aGFuIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uXG4gKlxuICogQGNvbnN0IFVJS2V5c1xuICogQHR5cGUge1VJS2V5c1R5cGV9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVUlLZXlzID0ge1xuICBSRUZMRUNUOiBgJHtNb2RlbEtleXMuUkVGTEVDVH0udWkuYCxcbiAgVUlNT0RFTDogXCJ1aW1vZGVsXCIsXG4gIFJFTkRFUkVEX0JZOiBcInJlbmRlcmVkLWJ5XCIsXG4gIEVMRU1FTlQ6IFwiZWxlbWVudFwiLFxuICBQUk9QOiBcInByb3BcIixcbiAgQ0hJTEQ6IFwiY2hpbGRcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIE5BTUVfUFJFRklYOiBcImlucHV0LVwiLFxuICBDVVNUT01fUFJPUFM6IFwiY3VzdG9tVmFsaWRhdGlvblByb3BzXCIsXG5cbiAgVUlMSVNUSVRFTTogXCJ1aWxpc3RpdGVtXCIsXG4gIFVJTElTVFBST1A6IFwibGlzdHByb3BcIixcbiAgVUlMQVlPVVQ6IFwidWlsYXlvdXRcIixcbiAgVUlMQVlPVVRJVEVNOiBcInVpbGF5b3V0aXRlbVwiLFxuICBIQU5ETEVSUzogXCJoYW5kbGVyc1wiLFxuXG4gIFRZUEU6IFwidHlwZVwiLFxuICBTVUJfVFlQRTogXCJzdWJ0eXBlXCIsXG5cbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBGT1JNQVQ6IFwiZm9ybWF0XCIsXG5cbiAgUkVBRF9PTkxZOiBcInJlYWRvbmx5XCIsXG4gIFJFUVVJUkVEOiBWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCxcbiAgTUlOOiBWYWxpZGF0aW9uS2V5cy5NSU4sXG4gIE1JTl9MRU5HVEg6IFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgsXG4gIE1BWDogVmFsaWRhdGlvbktleXMuTUFYLFxuICBNQVhfTEVOR1RIOiBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RILFxuICBQQVRURVJOOiBWYWxpZGF0aW9uS2V5cy5QQVRURVJOLFxuICBVUkw6IFZhbGlkYXRpb25LZXlzLlVSTCxcbiAgU1RFUDogVmFsaWRhdGlvbktleXMuU1RFUCxcbiAgREFURTogVmFsaWRhdGlvbktleXMuREFURSxcbiAgRU1BSUw6IFZhbGlkYXRpb25LZXlzLkVNQUlMLFxuICBQQVNTV09SRDogVmFsaWRhdGlvbktleXMuUEFTU1dPUkQsXG4gIEVRVUFMUzogVmFsaWRhdGlvbktleXMuRVFVQUxTLFxuICBESUZGOiBWYWxpZGF0aW9uS2V5cy5ESUZGLFxuICBMRVNTX1RIQU46IFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTixcbiAgTEVTU19USEFOX09SX0VRVUFMOiBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEdSRUFURVJfVEhBTjogVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6IFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgaW5wdXQgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3JzXG4gKiBAc3VtbWFyeSBNYXBzIHNwZWNpYWwgaW5wdXQgdHlwZXMgdG8gdGhlaXIgdmFsaWRhdG9yIGNsYXNzZXNcbiAqIFRoaXMgY29uc3RhbnQgbWFwcyBpbnB1dCB0eXBlcyBsaWtlIGVtYWlsLCBVUkwsIGRhdGUsIGFuZCBwYXNzd29yZCB0byB0aGVpclxuICogY29ycmVzcG9uZGluZyB2YWxpZGF0b3IgY2xhc3NlcyBmcm9tIHRoZSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj59IFZhbGlkYXRhYmxlQnlUeXBlTWFwXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEVtYWlsVmFsaWRhdG9yPn0gZW1haWwgLSBWYWxpZGF0b3IgZm9yIGVtYWlsIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxVUkxWYWxpZGF0b3I+fSB1cmwgLSBWYWxpZGF0b3IgZm9yIFVSTCBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RGF0ZVZhbGlkYXRvcj59IGRhdGUgLSBWYWxpZGF0b3IgZm9yIGRhdGUgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFBhc3N3b3JkVmFsaWRhdG9yPn0gcGFzc3dvcmQgLSBWYWxpZGF0b3IgZm9yIHBhc3N3b3JkIGlucHV0c1xuICpcbiAqIEBjb25zdCBWYWxpZGF0YWJsZUJ5VHlwZVxuICogQHR5cGUge1ZhbGlkYXRhYmxlQnlUeXBlTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRhYmxlQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+PiA9IHtcbiAgW1VJS2V5cy5FTUFJTF06IEVtYWlsVmFsaWRhdG9yLFxuICBbVUlLZXlzLlVSTF06IFVSTFZhbGlkYXRvcixcbiAgW1VJS2V5cy5EQVRFXTogRGF0ZVZhbGlkYXRvcixcbiAgW1VJS2V5cy5QQVNTV09SRF06IFBhc3N3b3JkVmFsaWRhdG9yLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3JzXG4gKiBAc3VtbWFyeSBNYXBzIEhUTUwgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZWlyIHZhbGlkYXRvciBjbGFzc2VzXG4gKiBUaGlzIGNvbnN0YW50IG1hcHMgSFRNTCB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgbGlrZSByZXF1aXJlZCwgbWluLCBtYXgsIHBhdHRlcm4sIGV0Yy5cbiAqIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yIGNsYXNzZXMgZnJvbSB0aGUgZGVjb3JhdG9yLXZhbGlkYXRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+fSBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlTWFwXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFJlcXVpcmVkVmFsaWRhdG9yPn0gcmVxdWlyZWQgLSBWYWxpZGF0b3IgZm9yIHJlcXVpcmVkIGZpZWxkc1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNaW5WYWxpZGF0b3I+fSBtaW4gLSBWYWxpZGF0b3IgZm9yIG1pbmltdW0gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWF4VmFsaWRhdG9yPn0gbWF4IC0gVmFsaWRhdG9yIGZvciBtYXhpbXVtIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFN0ZXBWYWxpZGF0b3I+fSBzdGVwIC0gVmFsaWRhdG9yIGZvciBzdGVwIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1pbkxlbmd0aFZhbGlkYXRvcj59IG1pbmxlbmd0aCAtIFZhbGlkYXRvciBmb3IgbWluaW11bSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWF4TGVuZ3RoVmFsaWRhdG9yPn0gbWF4bGVuZ3RoIC0gVmFsaWRhdG9yIGZvciBtYXhpbXVtIGxlbmd0aFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxQYXR0ZXJuVmFsaWRhdG9yPn0gcGF0dGVybiAtIFZhbGlkYXRvciBmb3IgcmVnZXggcGF0dGVyblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxFcXVhbHNWYWxpZGF0b3I+fSBlcXVhbHMgLSBWYWxpZGF0b3IgZm9yIGVxdWFsaXR5XG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPERpZmZWYWxpZGF0b3I+fSBkaWZmIC0gVmFsaWRhdG9yIGZvciBkaWZmZXJlbmNlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPExlc3NUaGFuVmFsaWRhdG9yPn0gbGVzc3RoYW4gLSBWYWxpZGF0b3IgZm9yIGxlc3MgdGhhbiBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcj59IGxlc3N0aGFub3JlcXVhbCAtIFZhbGlkYXRvciBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8R3JlYXRlclRoYW5WYWxpZGF0b3I+fSBncmVhdGVydGhhbiAtIFZhbGlkYXRvciBmb3IgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8R3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yPn0gZ3JlYXRlcnRoYW5vcmVxdWFsIC0gVmFsaWRhdG9yIGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICpcbiAqIEBjb25zdCBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlXG4gKiBAdHlwZSB7VmFsaWRhdGFibGVCeUF0dHJpYnV0ZU1hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlOiBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+PiA9IHtcbiAgW1VJS2V5cy5SRVFVSVJFRF06IFJlcXVpcmVkVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1JTl06IE1pblZhbGlkYXRvcixcbiAgW1VJS2V5cy5NQVhdOiBNYXhWYWxpZGF0b3IsXG4gIFtVSUtleXMuU1RFUF06IFN0ZXBWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUlOX0xFTkdUSF06IE1pbkxlbmd0aFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NQVhfTEVOR1RIXTogTWF4TGVuZ3RoVmFsaWRhdG9yLFxuICBbVUlLZXlzLlBBVFRFUk5dOiBQYXR0ZXJuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkVRVUFMU106IEVxdWFsc1ZhbGlkYXRvcixcbiAgW1VJS2V5cy5ESUZGXTogRGlmZlZhbGlkYXRvcixcbiAgW1VJS2V5cy5MRVNTX1RIQU5dOiBMZXNzVGhhblZhbGlkYXRvcixcbiAgW1VJS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIFtVSUtleXMuR1JFQVRFUl9USEFOXTogR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIGZvciBIVE1MNSBkYXRlIGlucHV0c1xuICogQHN1bW1hcnkgRm9ybWF0IHN0cmluZyBmb3IgSFRNTDUgZGF0ZSBpbnB1dHMgKHl5eXktTU0tZGQpXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgdGhlIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciBIVE1MNSBkYXRlIGlucHV0cy5cbiAqXG4gKiBAY29uc3QgSFRNTDVEYXRlRm9ybWF0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1RGF0ZUZvcm1hdCA9IFwieXl5eS1NTS1kZFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb2xsZWN0aW9uIG9mIEhUTUw1IGlucHV0IHR5cGUgdmFsdWVzXG4gKiBAc3VtbWFyeSBNYXBzIGlucHV0IHR5cGUgY29uc3RhbnRzIHRvIHRoZWlyIEhUTUwgYXR0cmlidXRlIHZhbHVlc1xuICogVGhpcyBjb25zdGFudCBwcm92aWRlcyBhIG1hcHBpbmcgb2YgaW5wdXQgdHlwZSBjb25zdGFudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZ1xuICogSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1c2UgaW4gZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIVE1MNUlucHV0VHlwZXNNYXBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCVVRUT04gLSBCdXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IENIRUNLQk9YIC0gQ2hlY2tib3ggaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IENPTE9SIC0gQ29sb3IgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gRGF0ZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEVUSU1FX0xPQ0FMIC0gTG9jYWwgZGF0ZXRpbWUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEVtYWlsIGlucHV0IHR5cGUgd2l0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRklMRSAtIEZpbGUgdXBsb2FkIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBISURERU4gLSBIaWRkZW4gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElNQUdFIC0gSW1hZ2UgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PTlRIIC0gTW9udGggcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVIgLSBOdW1lcmljIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVNTV09SRCAtIFBhc3N3b3JkIGlucHV0IHR5cGUgd2l0aCBtYXNrZWQgdGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJBRElPIC0gUmFkaW8gYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSQU5HRSAtIFJhbmdlIHNsaWRlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVTRVQgLSBGb3JtIHJlc2V0IGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VBUkNIIC0gU2VhcmNoIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJNSVQgLSBGb3JtIHN1Ym1pdCBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRFTCAtIFRlbGVwaG9uZSBudW1iZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRFWFQgLSBCYXNpYyB0ZXh0IGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FIC0gVGltZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIFVSTCBpbnB1dCB0eXBlIHdpdGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFdFRUsgLSBXZWVrIHBpY2tlciBpbnB1dCB0eXBlXG4gKlxuICogQGNvbnN0IEhUTUw1SW5wdXRUeXBlc1xuICogQHR5cGUge0hUTUw1SW5wdXRUeXBlc01hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNUlucHV0VHlwZXMgPSB7XG4gIEJVVFRPTjogXCJidXR0b25cIixcbiAgQ0hFQ0tCT1g6IFwiY2hlY2tib3hcIixcbiAgQ09MT1I6IFwiY29sb3JcIixcbiAgREFURTogVUlLZXlzLkRBVEUsXG4gIERBVEVUSU1FX0xPQ0FMOiBcImRhdGV0aW1lLWxvY2FsXCIsXG4gIEVNQUlMOiBVSUtleXMuRU1BSUwsXG4gIEZJTEU6IFwiZmlsZVwiLFxuICBISURERU46IFwiaGlkZGVuXCIsXG4gIElNQUdFOiBcImltYWdlXCIsXG4gIE1PTlRIOiBcIm1vbnRoXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbiAgUEFTU1dPUkQ6IFVJS2V5cy5QQVNTV09SRCxcbiAgUkFESU86IFwicmFkaW9cIixcbiAgUkFOR0U6IFwicmFuZ2VcIixcbiAgUkVTRVQ6IFwicmVzZXRcIixcbiAgU0VBUkNIOiBcInNlYXJjaFwiLFxuICBTVUJNSVQ6IFwic3VibWl0XCIsXG4gIFRFTDogXCJ0ZWxcIixcbiAgVEVYVDogXCJ0ZXh0XCIsXG4gIFRFWFRBUkVBOiAndGV4dGFyZWEnLFxuICBTRUxFQ1Q6ICdzZWxlY3QnLFxuICBUSU1FOiBcInRpbWVcIixcbiAgVVJMOiBVSUtleXMuVVJMLFxuICBXRUVLOiBcIndlZWtcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgdXNlIGNoZWNrYm94ZXNcbiAqIEBzdW1tYXJ5IExpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnQgY2hlY2thYmxlIGNvbnRyb2xzXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgYW4gYXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnRcbiAqIGNoZWNrYWJsZSBjb250cm9scyAoY2hlY2tib3ggYW5kIHJhZGlvKS5cbiAqXG4gKiBAY29uc3QgSFRNTDVDaGVja1R5cGVzXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVDaGVja1R5cGVzID0gW1xuICBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1gsXG4gIEhUTUw1SW5wdXRUeXBlcy5SQURJTyxcbl07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSByZW5kZXJpbmcgb3BlcmF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBTcGVjaWFsaXplZCBlcnJvciBmb3IgcmVuZGVyaW5nIGZhaWx1cmVzIGluIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIHJlbmRlcmluZyBlbmdpbmUgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZVxuICogYXR0ZW1wdGluZyB0byByZW5kZXIgYSBVSSBjb21wb25lbnQgb3IgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93aW5nIGEgcmVuZGVyaW5nIGVycm9yXG4gKiB0cnkge1xuICogICAvLyBSZW5kZXJpbmcgY29kZSB0aGF0IG1pZ2h0IGZhaWxcbiAqICAgaWYgKCFjb21wb25lbnQuY2FuUmVuZGVyKCkpIHtcbiAqICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoJ0NvbXBvbmVudCBjYW5ub3QgYmUgcmVuZGVyZWQnKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVuZGVyaW5nIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlcmluZ0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFJlbmRlcmluZ0Vycm9yIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBlcnJvciB3aXRoIGEgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIFRoZSBlcnJvciBtZXNzYWdlIG9yIG9yaWdpbmFsIGVycm9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUmVuZGVyaW5nRXJyb3IubmFtZSwgbXNnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgZm9ybWF0RGF0ZSxcbiAgTW9kZWwsXG4gIHBhcnNlRGF0ZSxcbiAgUmVzZXJ2ZWRNb2RlbHMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEhUTUw1RGF0ZUZvcm1hdCwgSFRNTDVJbnB1dFR5cGVzLCBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGaWVsZFByb3BlcnRpZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBmdW5jdGlvbiBmb3JtYXRCeVR5cGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5VHlwZShcbiAgdHlwZTogYW55LFxuICB2YWx1ZTogYW55LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IHN0cmluZyB8IG51bWJlciB7XG4gIGlmICh0eXBlID09PSBVSUtleXMuREFURSkge1xuICAgIGlmKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSAoYXJncy5zaGlmdCgpIGFzIHN0cmluZykgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHZhbHVlKSwgZm9ybWF0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQnlUeXBlKFxuICB0eXBlOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGZpZWxkUHJvcHM6IEZpZWxkUHJvcGVydGllc1xuKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgQXJyYXkubmFtZToge1xuICAgICAgY29uc3QgcGFyc2VkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAgdmFsdWUubWFwKHYgPT4gcGFyc2VWYWx1ZUJ5VHlwZShcbiAgICAgICAgUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLCB2LCBmaWVsZFByb3BzXG4gICAgICApKSA6IFt2YWx1ZV07XG4gICAgICByZXN1bHQgPSBwYXJzZWQuam9pbihcIixcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgcmVzdWx0ID0gcGFyc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOiB7XG4gICAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpZWxkUHJvcHMuZm9ybWF0O1xuICAgICAgaWYodmFsdWUgJiYgYCR7dmFsdWV9YC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5OVU1CRVJcbiAgICAgICAgICAgID8gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgID8gZm9ybWF0XG4gICAgICAgICAgICAgICAgPyBwYXJzZURhdGUoZm9ybWF0LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmVzdWx0ID0gXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuT0JKRUNUID8gXG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbihcIixcIikgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDpcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTiA/XG4gICAgICAgICAgICAgIHZhbHVlIDogdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5TVFJJTkcgPyBcbiAgICAgICAgICAgICAgICBlc2NhcGVIdG1sKHZhbHVlIGFzIHN0cmluZykgOiByZXN1bHQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdmFsdWUgb2YgdHlwZSAke3R5cGV9IGZyb20gJHt0eXBlb2YgdmFsdWV9IC0gJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4ocGFyc2VkKSkgcmV0dXJuIHBhcnNlZDtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJlwiOiBcIiZhbXA7XCIsXG4gICAgXCI8XCI6IFwiJmx0O1wiLFxuICAgIFwiPlwiOiBcIiZndDtcIixcbiAgfTtcbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyY8Pl0vZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVydEh0bWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJmFtcDtcIjogXCImXCIsXG4gICAgXCImbHQ7XCI6IFwiPFwiLFxuICAgIFwiJmd0O1wiOiBcIj5cIixcbiAgfTtcblxuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC8mbHQ7fCZndDt8JmFtcDsvZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlNb2RlbElEPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgbGV0IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgaWQgPSBmaW5kTW9kZWxJZChtb2RlbCkgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIGlkID0gRGF0ZS5ub3coKTtcbiAgfVxuICBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgcmV0dXJuIGAke25hbWV9LSR7aWR9YDtcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUNsYXNzTWV0YWRhdGEsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxheW91dEl0ZW1NZXRhZGF0YSxcbiAgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlNb2RlbE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgZm9ybWF0QnlUeXBlLCBnZW5lcmF0ZVVJTW9kZWxJRCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGNsYXNzIGZvciByZW5kZXJpbmcgVUkgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IFRoZSBSZW5kZXJpbmdFbmdpbmUgY2xhc3MgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGNvbnZlcnRpbmcgbW9kZWwgbWV0YWRhdGEgaW50byBVSSBmaWVsZCBkZWZpbml0aW9ucy5cbiAqIEl0IGhhbmRsZXMgdGhlIHRyYW5zbGF0aW9uIG9mIG1vZGVsIHByb3BlcnRpZXMgdG8gVUkgZWxlbWVudHMsIGFwcGxpZXMgdmFsaWRhdGlvbiBydWxlcywgYW5kIG1hbmFnZXMgZGlmZmVyZW50IHJlbmRlcmluZyBmbGF2b3JzLlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZCBieSBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgcmVzdWx0LCBkZWZhdWx0cyB0byB2b2lkXG4gKiBAdGVtcGxhdGUgUiBUaGUgdHlwZSBvZiB0aGUgZmllbGQgZGVmaW5pdGlvbiwgZGVmYXVsdHMgdG8gRmllbGREZWZpbml0aW9uPFQ+XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFbmdpbmVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcmluZ0VuZ2luZTxUID0gdm9pZCwgUiA9IEZpZWxkRGVmaW5pdGlvbjxUPj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhY2hlIGZvciBzdG9yaW5nIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2VzIG9yIGNvbnN0cnVjdG9ycy5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnRseSBhY3RpdmUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDpcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPjtcblxuICAvKipcbiAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlbmRlcmluZyBlbmdpbmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgZmxhdm91cjogc3RyaW5nKSB7XG4gICAgUmVuZGVyaW5nRW5naW5lLnJlZ2lzdGVyKHRoaXMpO1xuICAgIGNvbnNvbGUubG9nKGBkZWNhZidzICR7Zmxhdm91cn0gcmVuZGVyaW5nIGVuZ2luZSBsb2FkZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIGZvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgYmV0d2VlbiBtb2RlbCB0eXBlcyBhbmQgSFRNTCBpbnB1dCB0eXBlcy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgbW9kZWwgZGF0YSB0eXBlcyB0byBhcHByb3ByaWF0ZSBIVE1MIGlucHV0IHR5cGVzIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0cmFuc2xhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvVmlldz10cnVlXSAtIERpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAodHJ1ZSBmb3IgbW9kZWwgdG8gdmlldywgZmFsc2UgZm9yIHZpZXcgdG8gbW9kZWwpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJhbnNsYXRlZCB0eXBlLlxuICAgKi9cbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCB0b1ZpZXc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodG9WaWV3KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLlNUUklORzpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLlRFWFQ7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSOlxuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkJJR0lOVDpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CT09MRUFOOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuREFURTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkRBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlNFTEVDVDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVYVDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuRU1BSUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNPTE9SOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5QQVNTV09SRDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5VUkw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlNFQVJDSDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuSElEREVOOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUQVJFQTpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuUkFESU86XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLlNUUklORztcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVI7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YOiBcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTjtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURTpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURVRJTUVfTE9DQUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRJTUU6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkRBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBjbGFzcyBkZWNvcmF0b3IgbWV0YWRhdGEgZm9yIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgVUktcmVsYXRlZCBjbGFzcyBkZWNvcmF0b3JzIGZyb20gYSBtb2RlbCBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5XG4gICAqIFRoaXMgbWV0aG9kIGNvbGxlY3RzIG1ldGFkYXRhIGZyb20gdmFyaW91cyBVSSBjbGFzcyBkZWNvcmF0b3JzIGluY2x1ZGluZyBAdWltb2RlbCxcbiAgICogQHVpbGlzdGl0ZW0sIEB1aWhhbmRsZXJzLCBhbmQgQHVpbGF5b3V0IGFwcGxpZWQgdG8gdGhlIG1vZGVsIGNsYXNzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyB7VUlDbGFzc01ldGFkYXRhW119IEFycmF5IG9mIFVJIGNsYXNzIG1ldGFkYXRhIG9iamVjdHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSk6IFVJQ2xhc3NNZXRhZGF0YVtdICB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksXG4gICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMQVlPVVQpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMQVlPVVQpLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pOztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBpdHMgbmF0dXJlLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVUkga2V5IHJlcHJlc2VudHMgYSB0eXBlIHRoYXQgaXMgaW5oZXJlbnRseSB2YWxpZGF0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZGF0YWJsZUJ5VHlwZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5VHlwZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHZhbGlkYXRpb24gdGhhdCBjYW4gYmUgYXBwbGllZCBhcyBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgVUkga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdmFsaWRhdGlvbiBtZXRhZGF0YSB0byBhbiBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdmFsaWRhdGlvbiBtZXRhZGF0YSBpbnRvIGEgdmFsdWUgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB2YWxpZGF0aW9uIGtleS5cbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uTWV0YWRhdGF9IHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSBUaGUgY29udmVydGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBrZXkgaXMgbm90IHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICovXG4gIHByb3RlY3RlZCB0b0F0dHJpYnV0ZVZhbHVlKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBhdHRyaWJ1dGUga2V5IFwiJHtrZXl9XCIuIEV4cGVjdGVkIG9uZSBvZjogJHtPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5qb2luKFwiLCBcIil9LmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4ga2V5ID09PSBVSUtleXMuUkVRVUlSRUQgPyB0cnVlIDogdmFsdWVba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBtb2RlbCB0byBhIGZpZWxkIGRlZmluaXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGluc3RhbmNlLCBleHRyYWN0aW5nIFVJLXJlbGF0ZWQgbWV0YWRhdGEgYW5kIHZhbGlkYXRpb24gcnVsZXMgdG8gY3JlYXRlIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFQgVHlwZSByZWZlcmVuY2luZyB0aGUgc3BlY2lmaWMgUmVuZGVyaW5nIGVuZ2luZSBmaWVsZCBwcm9wZXJ0aWVzL2lucHV0c1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNvbnZlcnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtnbG9iYWxQcm9wcz17fV0gLSBHbG9iYWwgcHJvcGVydGllcyB0byBhcHBseSB0byBhbGwgY2hpbGQgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dlbmVyYXRlSWQ9dHJ1ZV0gLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwb3B1bGF0ZSB0aGUgcmVuZGVyZXJJZCBwcm9wZXJ0eS5cbiAgICogQHJldHVybnMge0ZpZWxkRGVmaW5pdGlvbjxUPn0gQSBmaWVsZCBkZWZpbml0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFVJIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwuXG4gICAqIEB0aHJvd3Mge1JlbmRlcmluZ0Vycm9yfSBJZiBubyBVSSBkZWZpbml0aW9ucyBhcmUgc2V0IGZvciB0aGUgbW9kZWwgb3IgaWYgdGhlcmUgYXJlIGludmFsaWQgZGVjb3JhdG9ycy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICAgKiAgcGFydGljaXBhbnQgUkUgYXMgUmVuZGVyaW5nRW5naW5lXG4gICAqICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAgICogIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogIEMtPj5SRTogdG9GaWVsZERlZmluaXRpb24obW9kZWwsIGdsb2JhbFByb3BzKVxuICAgKiAgUkUtPj5SOiBnZXRNZXRhZGF0YShVSUtleXMuVUlNT0RFTCwgbW9kZWwuY29uc3RydWN0b3IpXG4gICAqICBSLS0+PlJFOiBVSU1vZGVsTWV0YWRhdGFcbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+XG4gICAqICBSRS0+PlI6IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVmFsaWRhdGlvbktleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT5cbiAgICogIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgUkUtPj5SRTogUHJvY2VzcyBVSSBkZWNvcmF0b3JzXG4gICAqICAgIFJFLT4+UkU6IEFwcGx5IHZhbGlkYXRpb24gcnVsZXNcbiAgICogIGVuZFxuICAgKiAgUkUtLT4+QzogRmllbGREZWZpbml0aW9uPFQ+XG4gICAqL1xuICBwcm90ZWN0ZWQgdG9GaWVsZERlZmluaXRpb248TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgICBnZW5lcmF0ZUlkOiBib29sZWFuID0gdHJ1ZVxuICApOiBGaWVsZERlZmluaXRpb248VD4ge1xuICAgIFxuICAgIGNvbnN0IHsgaW5oZXJpdFByb3BzLCAuLi5nbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cyB9ID0gZ2xvYmFsUHJvcHM7XG4gICAgZ2xvYmFsUHJvcHMgPSBnbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cztcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9ycyA9IHRoaXMuZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TT4obW9kZWwpO1xuXG4gICAgaWYgKCFjbGFzc0RlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICBgTm8gdWkgZGVmaW5pdGlvbnMgc2V0IGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9LiBEaWQgeW91IHVzZSBAdWltb2RlbD9gXG4gICAgICApO1xuXG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3IgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICAuLi5jbGFzc0RlY29yYXRvcnMsXG4gICAgICBpbmhlcml0UHJvcHMgPyBpbmhlcml0UHJvcHMgOiB7fSAvLyBvdmVycmlkZSB0YWcgYW5kIHByb3BlcnRpZXMgd2hlbiBpdCBpcyBhIGNvbXBvbmVudCB0aGF0IHNob3VsZCBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBpdHMgcGFyZW50LlxuICAgICk7XG4gICAgY29uc3QgeyB0YWcsIHByb3BzLCBpdGVtLCBoYW5kbGVycyB9ID0gY2xhc3NEZWNvcmF0b3I7XG5cbiAgICBjb25zdCB1aURlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+ID1cbiAgICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVCkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIERlY29yYXRvck1ldGFkYXRhW11cbiAgICAgID47XG4gICAgbGV0IGNoaWxkcmVuOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2hpbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IGl0ZW0/LnByb3BzIHx8IHt9O1xuICAgIGxldCBtYXBwZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBnZXRQYXRoID0gKHBhcmVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBwYXJlbnQgPyBbcGFyZW50LCBwcm9wXS5qb2luKFwiLlwiKSA6IHByb3A7XG4gICAgfTtcblxuICAgIGlmICh1aURlY29yYXRvcnMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdXG4gICAgICA+ID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICApIGFzIFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT47XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB1aURlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHVpRGVjb3JhdG9yc1trZXldO1xuICAgICAgICBjb25zdCB0eXBlcyA9IE9iamVjdC52YWx1ZXMoZGVjcykuZmlsdGVyKCh7a2V5fSkgPT4gW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgaWYgKHR5cGVzPy5sZW5ndGggPiAxKVxuICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgIGBPbmx5IG9uZSB0eXBlIG9mIGRlY29yYXRpb24gaXMgYWxsb3dlZC4gUGxlYXNlIGNob29zZSBiZXR3ZWVuIEB1aXByb3AsIEB1aWNoaWxkIG9yIEB1aWVsZW1lbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVjcy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBkZWNzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICByZXR1cm4gYS5rZXkgPT09IFVJS2V5cy5FTEVNRU5UID8gLTEgOiAxO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydGVkLmZvckVhY2goKGRlYykgPT4ge1xuICAgICAgICAgIGlmICghZGVjKSB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYE5vIGRlY29yYXRvciBmb3VuZGApO1xuXG4gICAgICAgICAgc3dpdGNoIChkZWMua2V5KSB7XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5QUk9QOiB7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5XSA9IGRlYy5wcm9wcyBhcyBVSVByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5DSElMRDoge1xuICAgICAgICAgICAgICBpZiAoIU1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwga2V5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYENoaWxkIFwiJHtrZXl9XCIgbXVzdCBiZSBhIG1vZGVsLmApO1xuXG4gICAgICAgICAgICAgIGxldCBDbGF6ejtcbiAgICAgICAgICAgICAgY29uc3Qgc3VibW9kZWwgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSBhcyBNb2RlbDtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0YWJsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHN1Ym1vZGVsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzdWJtb2RlbCk7XG4gICAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnN0YW5jZSBpZiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKGRlYy5wcm9wcy5wcm9wcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAgICAgICAgICAgPy5uYW1lIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBDbGF6eiA9IG5ldyAoTW9kZWwuZ2V0KGNsYXp6TmFtZSkgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD4pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbkdsb2JhbFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZ2xvYmFsUHJvcHMgfHwge30sIHtcIm1vZGVsXCI6IENsYXp6fSAse1xuICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZE9mOiBnZXRQYXRoKGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZywga2V5KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBpZihkZWMucHJvcHM/Lm5hbWUpXG4gICAgICAgICAgICAgICAgbWFwcGVyW2RlYy5wcm9wcz8ubmFtZSBhcyBzdHJpbmddID0ga2V5O1xuICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgY2xhc3NEZWNvcmF0b3IucHJvcHM/Lml0ZW0gfHwge30sXG4gICAgICAgICAgICAgICAgaXRlbT8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZGVjLnByb3BzPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjaGlsZFByb3BzID0ge1xuICAgICAgICAgICAgICAgIHRhZzogaXRlbT8udGFnIHx8IHByb3BzLnJlbmRlciB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAge30sIFxuICAgICAgICAgICAgICAgICAgY2hpbGRQcm9wcz8ucHJvcHMsIFxuICAgICAgICAgICAgICAgICAgeyBtYXBwZXIgfSwgXG4gICAgICAgICAgICAgICAgICBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5ISURERU46IFxuICAgICAgICAgICAgY2FzZSBVSUtleXMuRUxFTUVOVDoge1xuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCB1aVByb3BzOiBVSUVsZW1lbnRNZXRhZGF0YSA9IGRlYy5wcm9wcyBhcyBVSUVsZW1lbnRNZXRhZGF0YTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICBjaGlsZFByb3BzPy5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgICAodWlQcm9wcz8ucHJvcHM/Lm5hbWUgPyB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGdldFBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRPZjogdW5kZWZpbmVkLCAvLyBUaGUgY2hpbGRPZiBwcm9wIGlzIHBhc3NlZCBieSBnbG9iYWxQcm9wcyB3aGVuIGl0IGlzIGEgbmVzdGVkIHByb3BcbiAgICAgICAgICAgICAgICAgIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gdWlQcm9wcy50YWcgfHwgY2hpbGRQcm9wcz8udGFnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgaWYoZGVjLmtleSA9PT0gVUlLZXlzLkVMRU1FTlQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRGVjcyA9IHZhbGlkYXRpb25EZWNvcmF0b3JzW2tleV0gYXMgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVEZWMgPSB2YWxpZGF0aW9uRGVjcy5zaGlmdCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIHZhbGlkYXRpb25EZWNzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW3RoaXMudHJhbnNsYXRlKGRlYy5rZXkpXSA9IHRoaXMudG9BdHRyaWJ1dGVWYWx1ZShkZWMua2V5LCBkZWMucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeVR5cGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IEhUTUw1SW5wdXRUeXBlcy5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdID0gZGVjLnByb3BzLmZvcm1hdCB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IGRlYy5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYmFzaWNUeXBlID0gKHR5cGVEZWMucHJvcHMgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0gPSB0aGlzLnRyYW5zbGF0ZShcbiAgICAgICAgICAgICAgICAgICAgYmFzaWNUeXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzLnZhbHVlID0gZm9ybWF0QnlUeXBlKFxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSxcbiAgICAgICAgICAgICAgICAgIG1vZGVsW2tleSBhcyBrZXlvZiBNXSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZERlZmluaXRpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmKGRlYy5rZXkgPT09IFVJS2V5cy5ISURERU4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuLmZpbmQoYyA9PiBjLnByb3BzPy5uYW1lID09PSBrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBjaGlsZC5wcm9wcywgeyBbZGVjLmtleV06IHVpUHJvcHMgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGREZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5VSUxBWU9VVElURU06IFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYEludmFsaWQga2V5OiAke2RlYy5rZXl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnbG9iYWxQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBnbG9iYWxQcm9wcywge1xuICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzIHx8IHt9LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdDogRmllbGREZWZpbml0aW9uPFQ+ID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBpdGVtOiBjaGlsZFByb3BzIGFzIFVJTGlzdEl0ZW1FbGVtZW50TWV0YWRhdGEsXG4gICAgICBwcm9wczogZ2xvYmFsUHJvcHMgYXMgVCAmIEZpZWxkUHJvcGVydGllcyxcbiAgICAgIGNoaWxkcmVuOiAoKE9iamVjdC5rZXlzKHVpRGVjb3JhdG9ycyk/Lmxlbmd0aCAmJiBjaGlsZHJlbj8ubGVuZ3RoKSA/IFxuICAgICAgICB0aGlzLmdldExheW91dEl0ZW1zKGNoaWxkcmVuLCB1aURlY29yYXRvcnMpIDogY2hpbGRyZW4pLFxuICAgIFxuICAgIH07XG5cbiAgICBpZiAoZ2VuZXJhdGVJZCkgcmVzdWx0LnJlbmRlcmVySWQgPSBnZW5lcmF0ZVVJTW9kZWxJRChtb2RlbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGxheW91dCBpdGVtcyBmb3IgZ3JpZCBwb3NpdGlvbmluZ1xuICAgKiBAc3VtbWFyeSBNYXBzIGNoaWxkIGZpZWxkIGRlZmluaXRpb25zIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgbGF5b3V0IHBvc2l0aW9uc1xuICAgKiBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0aHJvdWdoIGNoaWxkIGZpZWxkIGRlZmluaXRpb25zIGFuZCBhcHBsaWVzIGxheW91dCBtZXRhZGF0YVxuICAgKiBmcm9tIEB1aWxheW91dGl0ZW0gZGVjb3JhdG9ycyB0byBwb3NpdGlvbiB0aGVtIGNvcnJlY3RseSBpbiBhIGdyaWQgbGF5b3V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0ZpZWxkRGVmaW5pdGlvbltdfSBjaGlsZHJlbiAtIEFycmF5IG9mIGNoaWxkIGZpZWxkIGRlZmluaXRpb25zIHRvIHByb2Nlc3NcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB1aURlY29yYXRvcnMgLSBVSSBkZWNvcmF0b3IgbWV0YWRhdGEga2V5ZWQgYnkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uW119IEFycmF5IG9mIGZpZWxkIGRlZmluaXRpb25zIHdpdGggbGF5b3V0IHBvc2l0aW9uaW5nIGFwcGxpZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW50ZXJuYWwgdXNhZ2UgLSBwb3NpdGlvbnMgY2hpbGRyZW4gaW4gZ3JpZCBsYXlvdXRcbiAgICogY29uc3QgbGF5b3V0Q2hpbGRyZW4gPSB0aGlzLmdldExheW91dEl0ZW1zKGNoaWxkRGVmaW5pdGlvbnMsIGRlY29yYXRvck1ldGFkYXRhKTtcbiAgICovXG4gIGdldExheW91dEl0ZW1zKGNoaWxkcmVuOiBGaWVsZERlZmluaXRpb248YW55PltdLCB1aURlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBGaWVsZERlZmluaXRpb248YW55PltdIHtcbiAgICByZXR1cm4gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgbGV0IHVwZGF0ZWRDaGlsZCA9IGNoaWxkO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB1aURlY29yYXRvcnNba2V5XTtcbiAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5VSUxBWU9VVElURU0gJiZcbiAgICAgICAgICAgIChkZWMucHJvcHM/Lm5hbWUgPT09IGNoaWxkLnByb3BzPy5uYW1lIHx8IGRlYy5wcm9wcz8ubmFtZSA9PT0gY2hpbGQucHJvcHM/LmNoaWxkT2YpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbCwgcHJvcHMsIHJvdyB9ID0gZGVjLnByb3BzIGFzIFVJTGF5b3V0SXRlbU1ldGFkYXRhO1xuICAgICAgICAgICAgdXBkYXRlZENoaWxkID0ge1xuICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgLi4uY2hpbGQucHJvcHMsXG4gICAgICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlZENoaWxkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgd2l0aCBnbG9iYWwgcHJvcGVydGllcyBhbmQgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGRlZmluZSBzcGVjaWZpYyByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIFJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgb3V0cHV0IHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZ2xvYmFsUHJvcHMgLSBHbG9iYWwgcHJvcGVydGllcyB0byBiZSBhcHBsaWVkIHRvIGFsbCBlbGVtZW50cyBkdXJpbmcgcmVuZGVyaW5nLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgcmVxdWlyZWQgZm9yIHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSfSBUaGUgcmVuZGVyZWQgcmVzdWx0LCB0eXBlIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFic3RyYWN0IHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQWRkcyBhIHJlbmRlcmluZyBlbmdpbmUgdG8gdGhlIHN0YXRpYyBjYWNoZSBhbmQgc2V0cyBpdCBhcyB0aGUgY3VycmVudCBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+fSBlbmdpbmUgLSBUaGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZWdpc3Rlci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW4gZW5naW5lIHdpdGggdGhlIHNhbWUgZmxhdm9yIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICBpZiAoZW5naW5lLmZsYXZvdXIgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2VuZ2luZS5mbGF2b3VyfSBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICk7XG4gICAgdGhpcy5jYWNoZVtlbmdpbmUuZmxhdm91cl0gPSBlbmdpbmU7XG4gICAgdGhpcy5jdXJyZW50ID0gZW5naW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgaW5pdGlhbGl6ZXMgYSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBHZXRzIGFuIGV4aXN0aW5nIGVuZ2luZSBpbnN0YW5jZSBvciBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBvbmUgaWYgZ2l2ZW4gYSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPn0gb2JqIC0gVGhlIGVuZ2luZSBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIGluaXRpYWxpemVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE9yQm9vdDxPPihcbiAgICBvYmo6IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVuZGVyaW5nRW5naW5lKSByZXR1cm4gb2JqIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgICBjb25zdCBlbmdpbmU6IFJlbmRlcmluZ0VuZ2luZTxPPiA9IG5ldyBvYmooKTtcbiAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOyAvLyBtYWtlIHRoZSBib290aW5nIGFzeW5jLiB1c2UgdGhlIGluaXRpYWxpemVkIGZsYWcgdG8gY29udHJvbCBpdFxuICAgIHJldHVybiBlbmdpbmUgYXMgUmVuZGVyaW5nRW5naW5lPE8+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZW5kZXJpbmcgZW5naW5lIGJ5IGZsYXZvci5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgY3VycmVudCByZW5kZXJpbmcgZW5naW5lIG9yIGEgc3BlY2lmaWMgb25lIGJ5IGZsYXZvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UmVuZGVyaW5nRW5naW5lPE8+fSBUaGUgcmVxdWVzdGVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSByZXF1ZXN0ZWQgZmxhdm9yIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0PE8+KGZsYXZvdXI/OiBzdHJpbmcpOiBSZW5kZXJpbmdFbmdpbmU8Tz4ge1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHJldHVybiB0aGlzLmdldE9yQm9vdDxPPihcbiAgICAgICAgdGhpcy5jdXJyZW50IGFzIENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICAgICk7XG4gICAgaWYgKCEoZmxhdm91ciBpbiB0aGlzLmNhY2hlKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2ZsYXZvdXJ9IGRvZXMgbm90IGV4aXN0YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICB0aGlzLmNhY2hlW2ZsYXZvdXJdIGFzXG4gICAgICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PlxuICAgICAgICB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgYSBtb2RlbCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29ycmVjdCByZW5kZXJpbmcgZW5naW5lIGZvciBhIG1vZGVsIGFuZCBpbnZva2VzIGl0cyByZW5kZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlbmRlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyByZWdpc3RlcmVkIG1vZGVsIGlzIGZvdW5kLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVuZGVyPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9XG4gICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgfHwgTW9kZWwuZnJvbU9iamVjdChtb2RlbCk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBtb2RlbCByZWdpc3RlcmVkIGZvdW5kXCIpO1xuICAgIGNvbnN0IGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUkVOREVSRURfQlkpLFxuICAgICAgY29uc3RydWN0b3IgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD5cbiAgICApO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmb3IgdGhlIHZhciBhcmdzIHR5cGUgY2hlY2tcbiAgICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLmdldChmbGF2b3VyKS5yZW5kZXIobW9kZWwsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBtZXRhZGF0YSBrZXkgZm9yIFVJLXJlbGF0ZWQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgUHJlZml4ZXMgYSBnaXZlbiBrZXkgd2l0aCB0aGUgVUkgcmVmbGVjdGlvbiBwcmVmaXguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHByZWZpeC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHByZWZpeGVkIGtleS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1VJS2V5cy5SRUZMRUNUfSR7a2V5fWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuLi91aS9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4uL3VpL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGEsIFVJTWVkaWFCcmVha1BvaW50cywgVUlNb2RlbE1ldGFkYXRhIH0gZnJvbSBcIi4uL3VpL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHRhZ3MgYSBjbGFzcyBhcyBhIFVJIG1vZGVsXG4gKiBAc3VtbWFyeSBBZGRzIHJlbmRlcmluZyBjYXBhYmlsaXRpZXMgdG8gYSBtb2RlbCBjbGFzcyBieSBwcm92aWRpbmcgYSByZW5kZXIgbWV0aG9kXG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBjbGFzcyB0aGF0IGVuYWJsZXMgaXQgdG8gYmUgcmVuZGVyZWQgYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuXG4gKiBUaGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGFuZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgSFRNTCB0YWcgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgbW9kZWwgKGRlZmF1bHRzIHRvIGNsYXNzIG5hbWUpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aW1vZGVsXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgdGFnIChjbGFzcyBuYW1lKVxuICogQHVpbW9kZWwoKVxuICogY2xhc3MgVXNlclByb2ZpbGUgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCdkaXYnLCB7IGNsYXNzOiAndXNlci1jYXJkJyB9KVxuICogY2xhc3MgVXNlckNhcmQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpbW9kZWxcbiAqICAgcGFydGljaXBhbnQgY29uc3RydWN0b3JcbiAqICAgcGFydGljaXBhbnQgaW5zdGFuY2VcbiAqICAgU3lzdGVtLT4+dWltb2RlbDpkbyhjb25zdHJ1Y3RvcilcbiAqICAgdWltb2RlbC0+PmNvbnN0cnVjdG9yOiBFeGVjdXRlcyB0aGUgY29uc3RydWN0b3JcbiAqICAgY29uc3RydWN0b3ItPj51aW1vZGVsOiByZXR1cm5zIGluc3RhbmNlXG4gKiAgIHVpbW9kZWwtPj5pbnN0YW5jZTogYWRkcyB0aGUgcmVuZGVyIG1ldGhvZFxuICogICB1aW1vZGVsLT4+U3lzdGVtOiByZXR1cm5zIFVJTW9kZWwgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbW9kZWwodGFnPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YTogVUlNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgIHByb3BzOiBwcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSU1PREVMKSwgbWV0YSkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzcGVjaWZpZXMgd2hpY2ggcmVuZGVyaW5nIGVuZ2luZSB0byB1c2UgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSBtb2RlbCB3aXRoIGEgc3BlY2lmaWMgcmVuZGVyaW5nIGVuZ2luZSBpbXBsZW1lbnRhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCByZW5kZXJpbmcgZW5naW5lIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzLFxuICogZW5hYmxpbmcgZGlmZmVyZW50IHJlbmRlcmluZyBzdHJhdGVnaWVzIGZvciBkaWZmZXJlbnQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmdpbmUgVGhlIG5hbWUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gcmVuZGVyZWRCeVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3BlY2lmeSBhIGN1c3RvbSByZW5kZXJpbmcgZW5naW5lIGZvciBhIG1vZGVsXG4gKiBAdWltb2RlbCgpXG4gKiBAcmVuZGVyZWRCeSgncmVhY3QnKVxuICogY2xhc3MgUmVhY3RDb21wb25lbnQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHJlbmRlcmVkQnlcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnJlbmRlcmVkQnk6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHJlbmRlcmVkQnktPj5Nb2RlbDogYWRkcyBlbmdpbmUgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHVzZXMgc3BlY2lmaWVkIGVuZ2luZVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBjdXN0b20gZW5naW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJlZEJ5KGVuZ2luZTogc3RyaW5nKSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5SRU5ERVJFRF9CWSksIGVuZ2luZSkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgbW9kZWwgYXMgYSBsaXN0IGl0ZW0gZm9yIFVJIHJlbmRlcmluZ1xuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIG1vZGVsIHNob3VsZCBiZSByZW5kZXJlZCB3aGVuIGRpc3BsYXllZCBpbiBhIGxpc3QgY29udGV4dFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGFzIGEgbGlzdCBpdGVtXG4gKiBieSB0aGUgVUkgcmVuZGVyaW5nIGVuZ2luZS4gVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllc1xuICogd2hlbiBpdCBhcHBlYXJzIGluIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIGFzIGEgbGlzdCBpdGVtIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBsaXN0IGl0ZW0gZWxlbWVudFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGlzdGl0ZW1cbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCB0YWcgKGNsYXNzIG5hbWUpXG4gKiBAdWltb2RlbCgpXG4gKiBAdWlsaXN0aXRlbSgpXG4gKiBjbGFzcyBUb2RvSXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY29tcGxldGVkOiBib29sZWFuO1xuICogfVxuICpcbiAqIC8vIFVzYWdlIHdpdGggY3VzdG9tIHRhZyBhbmQgcHJvcGVydGllc1xuICogQHVpbW9kZWwoKVxuICogQHVpbGlzdGl0ZW0oJ2xpJywgeyBjbGFzczogJ2xpc3QtZ3JvdXAtaXRlbScgfSlcbiAqIGNsYXNzIExpc3RJdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdGl0ZW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnVpbGlzdGl0ZW06IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpbGlzdGl0ZW0tPj5Nb2RlbDogYWRkcyBsaXN0IGl0ZW0gbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHVzZXMgbGlzdCBpdGVtIG1ldGFkYXRhIHdoZW4gaW4gbGlzdCBjb250ZXh0XG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlN5c3RlbTogcmVuZGVycyB3aXRoIGxpc3QgaXRlbSBzdHlsaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxpc3RpdGVtKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTGlzdEl0ZW1Nb2RlbE1ldGFkYXRhID0ge1xuICAgICAgaXRlbToge1xuICAgICAgICB0YWc6IHRhZyB8fCBvcmlnaW5hbC5uYW1lLFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIG1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLCBtZXRhKShvcmlnaW5hbCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGV2ZW50IGhhbmRsZXJzIHRoYXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSByZW5kZXJlZCBtb2RlbFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgZXZlbnQgaGFuZGxlcnMgdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcbiAqIGF0dGFjaGVkIHRvIHRoZSByZW5kZXJlZCBVSSBlbGVtZW50LiBUaGUgaGFuZGxlcnMgYXJlIHBhc3NlZCBhcyBwcm9wZXJ0aWVzXG4gKiB0byB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gT2JqZWN0IGNvbnRhaW5pbmcgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYW5kIG90aGVyIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWhhbmRsZXJzXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgZXZlbnQgaGFuZGxlcnMgdG8gYSBtb2RlbFxuICogQHVpbW9kZWwoJ2J1dHRvbicpXG4gKiBAdWloYW5kbGVycyh7XG4gKiAgIG9uQ2xpY2s6IChldmVudCkgPT4gY29uc29sZS5sb2coJ0J1dHRvbiBjbGlja2VkJyksXG4gKiAgIG9uTW91c2VPdmVyOiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdNb3VzZSBvdmVyIGJ1dHRvbicpLFxuICogICBkaXNhYmxlZDogZmFsc2VcbiAqIH0pXG4gKiBjbGFzcyBDbGlja2FibGVCdXR0b24gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBsYWJlbDogc3RyaW5nO1xuICogfVxuICpcbiAqIC8vIEFkZCBmb3JtIHN1Ym1pc3Npb24gaGFuZGxlcnNcbiAqIEB1aW1vZGVsKCdmb3JtJylcbiAqIEB1aWhhbmRsZXJzKHtcbiAqICAgb25TdWJtaXQ6IChldmVudCkgPT4ge1xuICogICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gKiAgICAgY29uc29sZS5sb2coJ0Zvcm0gc3VibWl0dGVkJyk7XG4gKiAgIH0sXG4gKiAgIG9uUmVzZXQ6IChldmVudCkgPT4gY29uc29sZS5sb2coJ0Zvcm0gcmVzZXQnKVxuICogfSlcbiAqIGNsYXNzIENvbnRhY3RGb3JtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWhhbmRsZXJzXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBTeXN0ZW0tPj51aWhhbmRsZXJzOiBhcHBseSB0byBNb2RlbFxuICogICB1aWhhbmRsZXJzLT4+TW9kZWw6IGFkZHMgaGFuZGxlciBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogcmVxdWVzdHMgcmVuZGVyaW5nIHdpdGggaGFuZGxlcnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IHJlbmRlcnMgZWxlbWVudCB3aXRoIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkXG4gKiAgIFVJLT4+TW9kZWw6IHRyaWdnZXJzIGhhbmRsZXJzIG9uIGV2ZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWloYW5kbGVycyhwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIGhhbmRsZXJzOiBwcm9wc1xuICAgIH07XG4gICAgcmV0dXJuIG1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhBTkRMRVJTKSwgbWV0YSkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjcmVhdGVzIGEgbGF5b3V0IGNvbnRhaW5lciB3aXRoIGdyaWQgc3BlY2lmaWNhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbWJpbmVzIFVJIG1vZGVsIGZ1bmN0aW9uYWxpdHkgd2l0aCBsYXlvdXQgZ3JpZCBjb25maWd1cmF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBjcmVhdGVzIGEgVUkgbW9kZWwgdGhhdCBhY3RzIGFzIGEgbGF5b3V0IGNvbnRhaW5lciB3aXRoIHNwZWNpZmllZFxuICogY29sdW1uIGFuZCByb3cgY29uZmlndXJhdGlvbnMuIEl0J3MgYSBjb252ZW5pZW5jZSBkZWNvcmF0b3IgdGhhdCBjb21iaW5lc1xuICogQHVpbW9kZWwgd2l0aCBsYXlvdXQtc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgcmVzcG9uc2l2ZSBncmlkIGxheW91dHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCB0YWcgdG8gdXNlIGZvciB0aGUgbGF5b3V0IGNvbnRhaW5lclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb2xzPTFdIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkIGxheW91dFxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nW119IFtyb3dzPTFdIE51bWJlciBvZiByb3dzIG9yIGFycmF5IG9mIHJvdyBkZWZpbml0aW9uc1xuICogQHBhcmFtIHtVSU1lZGlhQnJlYWtQb2ludHN9IFticmVha3BvaW50PSdtJ10gTWVkaWEgYnJlYWtwb2ludCBmb3IgcmVzcG9uc2l2ZSBiZWhhdmlvclxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGF5b3V0XG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzaW1wbGUgMi1jb2x1bW4gbGF5b3V0XG4gKiBAdWlsYXlvdXQoJ2RpdicsIDIsIDMpXG4gKiBjbGFzcyBUd29Db2x1bW5MYXlvdXQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDEpXG4gKiAgIGhlYWRlcjogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMilcbiAqICAgbGVmdENvbnRlbnQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDIsIDIpXG4gKiAgIHJpZ2h0Q29udGVudDogc3RyaW5nO1xuICogfVxuICpcbiAqIC8vIENyZWF0ZSBhIHJlc3BvbnNpdmUgbGF5b3V0IHdpdGggY3VzdG9tIGJyZWFrcG9pbnRcbiAqIEB1aWxheW91dCgnc2VjdGlvbicsIDMsIDIsICdsJylcbiAqIGNsYXNzIFJlc3BvbnNpdmVMYXlvdXQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDEpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgyLCAxKVxuICogICBzdWJ0aXRsZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpbGF5b3V0XG4gKiAgIHBhcnRpY2lwYW50IHVpbW9kZWxcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnVpbGF5b3V0OiBhcHBseSB0byBNb2RlbFxuICogICB1aWxheW91dC0+PnVpbW9kZWw6IGNhbGwgd2l0aCBsYXlvdXQgcHJvcHNcbiAqICAgdWltb2RlbC0+Pk1vZGVsOiBhZGRzIG1vZGVsIG1ldGFkYXRhIHdpdGggbGF5b3V0IGNvbmZpZ1xuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogcmVxdWVzdHMgcmVuZGVyaW5nIGFzIGxheW91dCBjb250YWluZXJcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIGdyaWQgbGF5b3V0IHdpdGggc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGF5b3V0KHRhZzogc3RyaW5nLCBjb2xzOiBudW1iZXIgPSAxLCByb3dzOiBudW1iZXIgfCBzdHJpbmdbXSA9IDEsIGJyZWFrcG9pbnQ6IFVJTWVkaWFCcmVha1BvaW50cyA9ICdtJykge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgcmV0dXJuIHVpbW9kZWwodGFnLCB7Y29scywgcm93cywgYnJlYWtwb2ludH0pKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gIH07XG59IiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgcHJvdG90eXBlIHdpdGggcmVuZGVyaW5nIGNhcGFiaWxpdGllc1xuICogQHN1bW1hcnkgQWRkcyB0aGUgcmVuZGVyIG1ldGhvZCB0byBhbGwgTW9kZWwgaW5zdGFuY2VzIGZyb20gZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJlbmRlcmFibGUgaW50ZXJmYWNlIGZvciB0aGUgTW9kZWwgY2xhc3MgYnkgYWRkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogdG8gaXRzIHByb3RvdHlwZS4gVGhpcyBhbGxvd3MgYW55IE1vZGVsIGluc3RhbmNlIHRvIGJlIHJlbmRlcmVkIHVzaW5nIHRoZSBSZW5kZXJpbmdFbmdpbmUuXG4gKiBAbW9kdWxlIG1vZGVsL292ZXJyaWRlc1xuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzL21vZGVsXG4gKi9cblxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFbmdpbmUgfSBmcm9tIFwiLi4vdWkvUmVuZGVyaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgdGhlIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgcmVuZGVyaW5nIHRvIHRoZSBSZW5kZXJpbmdFbmdpbmUgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGFcbiAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHJlbmRlciBtZXRob2QgZnJvbSB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIGFsbCBNb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCB1c2VzIHRoZSBSZW5kZXJpbmdFbmdpbmUgdG8gZGV0ZXJtaW5lIGhvdyB0byByZW5kZXIgdGhlIG1vZGVsIGJhc2VkIG9uIGl0cyBtZXRhZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgTSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyByZW5kZXJlZFxuICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW5kZXJlZCBvdXRwdXQgaW4gdGhlIGZvcm1hdCBkZXRlcm1pbmVkIGJ5IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKi9cbk1vZGVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPih0aGlzOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLnJlbmRlcih0aGlzLCAuLi5hcmdzKTtcbn07XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMYXlvdXRJdGVtTWV0YWRhdGEsXG4gIFVJTGlzdFByb3BNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFbmdpbmUgfSBmcm9tIFwiLi9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eSBkdXJpbmcgc3BlY2lmaWMgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb250cm9scyBwcm9wZXJ0eSB2aXNpYmlsaXR5IGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIHNob3VsZCBoaWRlIGEgcHJvcGVydHlcbiAqIGluIHRoZSBVSS4gVGhlIHByb3BlcnR5IHdpbGwgb25seSBiZSB2aXNpYmxlIGR1cmluZyBvcGVyYXRpb25zIG5vdCBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbnMgLSBUaGUgQ1JVRCBvcGVyYXRpb25zIGR1cmluZyB3aGljaCB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGVPblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSGlkZSB0aGUgcGFzc3dvcmQgZmllbGQgZHVyaW5nIFJFQUQgb3BlcmF0aW9uc1xuICogY2xhc3MgVXNlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRlT24oT3BlcmF0aW9uS2V5cy5SRUFEKVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PmhpZGVPbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBoaWRkZW4gb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIG9yIGhpZGUgYmFzZWQgb24gY3VycmVudCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVPbiguLi5vcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uS2V5c1tdKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8Q3J1ZE9wZXJhdGlvbktleXNbXT4oXG4gICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSElEREVOKSxcbiAgICBvcGVyYXRpb25zXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGNvbXBsZXRlbHkgaGlkZXMgYSBwcm9wZXJ0eSBpbiBhbGwgVUkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgTWFrZXMgYSBwcm9wZXJ0eSBpbnZpc2libGUgaW4gYWxsIENSVUQgb3BlcmF0aW9uc1xuICogVGhpcyBkZWNvcmF0b3IgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBoaWRlT24gdGhhdCBoaWRlcyBhIHByb3BlcnR5XG4gKiBkdXJpbmcgYWxsIENSVUQgb3BlcmF0aW9ucyAoQ1JFQVRFLCBSRUFELCBVUERBVEUsIERFTEVURSkuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGRlblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29tcGxldGVseSBoaWRlIHRoZSBpbnRlcm5hbElkIGZpZWxkIGluIHRoZSBVSVxuICogY2xhc3MgUHJvZHVjdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGRlbigpXG4gKiAgIGludGVybmFsSWQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGhpZGRlblxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIE1vZGVsLT4+aGlkZGVuOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRkZW4tPj5oaWRlT246IENhbGwgd2l0aCBhbGwgb3BlcmF0aW9uc1xuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGFsbCBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBBbHdheXMgaGlkZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuKCkge1xuICByZXR1cm4gaGlkZU9uKFxuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBPcGVyYXRpb25LZXlzLkRFTEVURVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgVUkgZWxlbWVudFxuICogQHN1bW1hcnkgTWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgVUkgZWxlbWVudCB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB3aGljaCBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHNob3VsZCBiZSB1c2VkXG4gKiB0byByZW5kZXIgYSBzcGVjaWZpYyBwcm9wZXJ0eSwgYWxvbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhhdCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgdGFnIG5hbWUgdG8gdXNlIGZvciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpZWxlbWVudFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVuZGVyIGEgcHJvcGVydHkgYXMgYSB0ZXh0IGlucHV0XG4gKiBjbGFzcyBMb2dpbkZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciB1c2VybmFtZScgfSlcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdFbnRlciBwYXNzd29yZCcgfSlcbiAqICAgcGFzc3dvcmQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdidXR0b24nLCB7IGNsYXNzOiAnYnRuLXByaW1hcnknIH0pXG4gKiAgIHN1Ym1pdDogc3RyaW5nID0gJ0xvZ2luJztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpZWxlbWVudFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgTW9kZWwtPj51aWVsZW1lbnQ6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpZWxlbWVudC0+Pk1vZGVsOiBBZGQgZWxlbWVudCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiB0YWcgYW5kIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgd2l0aCBzcGVjaWZpZWQgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWllbGVtZW50KFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlFbGVtZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuRUxFTUVOVCksIG1ldGFkYXRhKShcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBVSSBjb21wb25lbnQgcHJvcGVydHlcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcGFzc2VkIHRvIGEgVUkgY29tcG9uZW50XG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBob3cgYSBtb2RlbCBwcm9wZXJ0eSBzaG91bGQgYmUgbWFwcGVkIHRvXG4gKiBhIHByb3BlcnR5IG9mIHRoZSBVSSBjb21wb25lbnQgd2hlbiByZW5kZXJpbmcuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZVxuICogZGVjb3JhdGVkIHdpdGggQHVpbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0cmluZ2lmeT1mYWxzZV0gV2hldGhlciB0byBzdHJpbmdpZnkgdGhlIHByb3BlcnR5IHZhbHVlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgbW9kZWwgcHJvcGVydGllcyB0byBjb21wb25lbnQgcHJvcGVydGllc1xuICogQHVpbW9kZWwoJ3VzZXItcHJvZmlsZScpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCkgLy8gV2lsbCBiZSBwYXNzZWQgYXMgJ2Z1bGxOYW1lJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGZ1bGxOYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckVtYWlsJykgLy8gV2lsbCBiZSBwYXNzZWQgYXMgJ3VzZXJFbWFpbCcgdG8gdGhlIGNvbXBvbmVudFxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJEYXRhJywgdHJ1ZSkgLy8gV2lsbCBiZSBwYXNzZWQgYXMgc3RyaW5naWZpZWQgSlNPTlxuICogICB1c2VyRGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpcHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWlwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aXByb3AtPj5Nb2RlbDogQWRkIHByb3AgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBzdHJpbmdpZnkgZmxhZ1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Db21wb25lbnQ6IFBhc3MgcHJvcGVydHkgd2l0aCBzcGVjaWZpZWQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlwcm9wKFxuICBwcm9wTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICBzdHJpbmdpZnk6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlQcm9wTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlBST1ApLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBuZXN0ZWQgbW9kZWwgcHJvcGVydHkgdG8gYSBVSSBjb21wb25lbnQgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBhIHBhcmVudCBjb21wb25lbnQgc2hvdWxkIHJlbmRlciB0aGUgY2hpbGQgbW9kZWwgd2hlbiBuZXN0ZWQuXG4gKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBkZWNvcmF0ZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5lc3RlZCBtb2RlbHMuXG4gKiBXaGVuIGFwcGxpZWQsIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHRhZyBvZiB0aGUgY2hpbGQgbW9kZWwgd2l0aCB0aGUgcHJvdmlkZWQgb25lLFxuICogZW5hYmxpbmcgZGlmZmVyZW50IHJlbmRlcmluZyBiZWhhdmlvciB3aGVuIHRoZSBtb2RlbCBhY3RzIGFzIGEgY2hpbGQgKG5lc3RlZClcbiAqIGNvbXBhcmVkIHRvIHdoZW4gaXQgaXMgcmVuZGVyZWQgYXMgdGhlIHBhcmVudCBtb2RlbC5cbiAqXG4gKiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmUgZGVjb3JhdGVkIHdpdGggYEB1aW1vZGVsYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhenogVGhlIG1vZGVsIGNsYXNzIG5hbWUgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgdGFnIG5hbWUgdG8gb3ZlcnJpZGUgdGhlIFVJIHRhZyBvZiB0aGUgbmVzdGVkIG1vZGVsXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gdWljaGlsZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIGEgbmVzdGVkIG1vZGVsIHRvIGEgY29tcG9uZW50IHByb3BlcnR5IHdpdGggYSBkaWZmZXJlbnQgdGFnIHdoZW4gbmVzdGVkXG4gKiBAdWltb2RlbCgnYWRkcmVzcy1jb21wb25lbnQnKVxuICogY2xhc3MgQWRkcmVzcyB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBzdHJlZXQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBjaXR5OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQHVpbW9kZWwoJ3VzZXItcHJvZmlsZScpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWljaGlsZChBZGRyZXNzLm5hbWUsICdhZGRyZXNzLWNoaWxkLWNvbXBvbmVudCcpXG4gKiAgIGFkZHJlc3M6IEFkZHJlc3M7XG4gKiB9XG4gKlxuICogLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgQWRkcmVzcyBtb2RlbCBoYXMgdGhlIGRlZmF1bHQgdGFnICdhZGRyZXNzLWNvbXBvbmVudCcgd2hlbiByZW5kZXJlZCBhcyBhIHJvb3QgY29tcG9uZW50LFxuICogLy8gYnV0IHdoZW4gdXNlZCBpbnNpZGUgVXNlclByb2ZpbGUsIGl0IGlzIHJlbmRlcmVkIHdpdGggdGhlIG92ZXJyaWRkZW4gdGFnICdhZGRyZXNzLWNoaWxkLWNvbXBvbmVudCdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpY2hpbGRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpY2hpbGQ6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpY2hpbGQtPj5Nb2RlbDogQWRkIGNoaWxkIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgY2hpbGQgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUsIHN0cmluZ2lmeSBmbGFnLCBhbmQgY2hpbGQgdGFnIG92ZXJyaWRlXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lIGFuZCByZW5kZXIgd2l0aCBvdmVycmlkZGVuIHRhZyBpZiBuZXN0ZWRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdWljaGlsZChcbiAgY2xheno6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gIGlzQXJyYXk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgc2VyaWFsaXplOiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwge1xuICAgICAgICBuYW1lOiBjbGF6eiB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIH0sIGlzQXJyYXkgPyB7Y3VzdG9tVHlwZXM6IFtBcnJheS5uYW1lXSwgbXVsdGlwbGU6IHRydWV9IDoge211bHRpcGxlOiBmYWxzZX0pLFxuICAgIH07XG5cbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuQ0hJTEQpLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIGxpc3QgaXRlbSBjb21wb25lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBsaXN0XG4gKiBzaG91bGQgYmUgcmVuZGVyZWQuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBAdWlsaXN0aXRlbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbGlzdCBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxpc3QgY29udGFpbmVyXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0cHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGEgbGlzdCBwcm9wZXJ0eSB3aXRoIGN1c3RvbSByZW5kZXJpbmdcbiAqIEB1aW1vZGVsKCd0b2RvLWxpc3QnKVxuICogY2xhc3MgVG9kb0xpc3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsaXN0cHJvcCgnaXRlbXMnLCB7IGNsYXNzOiAndG9kby1pdGVtcy1jb250YWluZXInIH0pXG4gKiAgIGl0ZW1zOiBUb2RvSXRlbVtdO1xuICogfVxuICpcbiAqIEB1aWxpc3RpdGVtKCdsaScsIHsgY2xhc3M6ICd0b2RvLWl0ZW0nIH0pXG4gKiBjbGFzcyBUb2RvSXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxpc3Rwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBMaXN0Q29udGFpbmVyXG4gKiAgIHBhcnRpY2lwYW50IExpc3RJdGVtc1xuICogICBNb2RlbC0+PnVpbGlzdHByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpbGlzdHByb3AtPj5Nb2RlbDogQWRkIGxpc3QgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxpc3QgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgY29udGFpbmVyIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RDb250YWluZXI6IENyZWF0ZSBjb250YWluZXIgd2l0aCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MaXN0SXRlbXM6IFJlbmRlciBlYWNoIGl0ZW0gdXNpbmcgQHVpbGlzdGl0ZW1cbiAqICAgTGlzdENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHJlbmRlcmVkIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdHByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGFydGlhbDxVSUxpc3RQcm9wTWV0YWRhdGE+ID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBwcm9wczogcHJvcHMgfHwge30sXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgcG9zaXRpb25zIGEgcHJvcGVydHkgaW4gYSBzcGVjaWZpYyBncmlkIGxheW91dCBwb3NpdGlvblxuICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2x1bW4gYW5kIHJvdyBwb3NpdGlvbiBmb3IgYSBwcm9wZXJ0eSBpbiBhIFVJIGxheW91dCBncmlkXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB0aGUgc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBwcm9wZXJ0eSB3aXRoaW5cbiAqIGEgZ3JpZC1iYXNlZCBsYXlvdXQgc3lzdGVtLiBJdCBzcGVjaWZpZXMgd2hpY2ggY29sdW1uIGFuZCByb3cgdGhlIHByb3BlcnR5XG4gKiBzaG91bGQgb2NjdXB5IHdoZW4gcmVuZGVyZWQgaW4gdGhlIFVJLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2wgVGhlIGNvbHVtbiBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcm93PTFdIFRoZSByb3cgcG9zaXRpb24gaW4gdGhlIGdyaWQgbGF5b3V0IChkZWZhdWx0cyB0byAxKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHM9e31dIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsYXlvdXQgaXRlbVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGF5b3V0aXRlbVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUG9zaXRpb24gcHJvcGVydGllcyBpbiBhIGdyaWQgbGF5b3V0XG4gKiBAdWltb2RlbCgndXNlci1mb3JtJylcbiAqIGNsYXNzIFVzZXJGb3JtIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMSkgLy8gRmlyc3QgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgyLCAxKSAvLyBTZWNvbmQgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgbGFzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDIsIHsgY29sc3BhbjogMiB9KSAvLyBGaXJzdCBjb2x1bW4sIHNlY29uZCByb3csIHNwYW5zIDIgY29sdW1uc1xuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMywgeyBjbGFzczogJ2Z1bGwtd2lkdGgnIH0pIC8vIEZpcnN0IGNvbHVtbiwgdGhpcmQgcm93IHdpdGggY3VzdG9tIGNsYXNzXG4gKiAgIGJpbzogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlsYXlvdXRpdGVtXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBMYXlvdXRDb250YWluZXJcbiAqICAgTW9kZWwtPj51aWxheW91dGl0ZW06IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpbGF5b3V0aXRlbS0+Pk1vZGVsOiBBZGQgbGF5b3V0IGl0ZW0gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBsYXlvdXQgaXRlbSBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGNvbHVtbiwgcm93LCBhbmQgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGF5b3V0Q29udGFpbmVyOiBQb3NpdGlvbiBlbGVtZW50IGF0IGdyaWQgY29vcmRpbmF0ZXNcbiAqICAgTGF5b3V0Q29udGFpbmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcG9zaXRpb25lZCBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxheW91dGl0ZW0oXG4gIGNvbDogbnVtYmVyLFxuICByb3c6IG51bWJlciA9IDEsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUxheW91dEl0ZW1NZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6ICBwcm9wZXJ0eUtleSxcbiAgICAgIGNvbCxcbiAgICAgIHJvdyxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksXG4gICAgfTsgIFxuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxBWU9VVElURU0pLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQgaGFuZGxlclxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciBoYW5kbGluZyBldmVudHMgaW4gdGhlIFVJIGRlY29yYXRvcnMgc3lzdGVtXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgbWFuYWdpbmcgYW5kIHByb2Nlc3NpbmcgZXZlbnRzIHRoYXQgb2NjdXJcbiAqIHdpdGhpbiB0aGUgVUkgY29tcG9uZW50cyBnZW5lcmF0ZWQgYnkgdGhlIGRlY29yYXRvcnMuXG4gKiBAY2xhc3MgRXZlbnRIYW5kbGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvdWlcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBFdmVudEhhbmRsZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRXZlbnRIYW5kbGVyIG9iamVjdFxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIGN1cnJlbnRseSBkb2Vzbid0IHRha2UgYW55IHBhcmFtZXRlcnMsIGJ1dCBpdCBjYW4gYmVcbiAgICogZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSB0byBhY2NlcHQgY29uZmlndXJhdGlvbiBvcHRpb25zIGlmIG5lZWRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cbn0iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBVSSBkZWNvcmF0b3JzIG1vZHVsZSBmb3IgVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnNcbiAqIEBzdW1tYXJ5IEEgY29sbGVjdGlvbiBvZiBkZWNvcmF0b3JzIGFuZCB1dGlsaXRpZXMgZm9yIGJ1aWxkaW5nIFVJIGNvbXBvbmVudHMgaW4gVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnMuXG4gKiBUaGlzIG1vZHVsZSBleHBvcnRzIGZ1bmN0aW9uYWxpdHkgZnJvbSBib3RoIHRoZSBtb2RlbCBhbmQgVUkgc3VibW9kdWxlcywgcHJvdmlkaW5nIGRlY29yYXRvcnMgZm9yXG4gKiByZW5kZXJpbmcsIGNvbXBvbmVudCBkZWZpbml0aW9uLCBhbmQgVUkgc3RhdGUgbWFuYWdlbWVudC5cbiAqIEBtb2R1bGUgdWktZGVjb3JhdG9yc1xuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91aVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24gZm9yIHJlZmVyZW5jZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJNb2RlbEtleXMiLCJWYWxpZGF0aW9uS2V5cyIsIkVtYWlsVmFsaWRhdG9yIiwiVVJMVmFsaWRhdG9yIiwiRGF0ZVZhbGlkYXRvciIsIlBhc3N3b3JkVmFsaWRhdG9yIiwiUmVxdWlyZWRWYWxpZGF0b3IiLCJNaW5WYWxpZGF0b3IiLCJNYXhWYWxpZGF0b3IiLCJTdGVwVmFsaWRhdG9yIiwiTWluTGVuZ3RoVmFsaWRhdG9yIiwiTWF4TGVuZ3RoVmFsaWRhdG9yIiwiUGF0dGVyblZhbGlkYXRvciIsIkVxdWFsc1ZhbGlkYXRvciIsIkRpZmZWYWxpZGF0b3IiLCJMZXNzVGhhblZhbGlkYXRvciIsIkxlc3NUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yIiwiQmFzZUVycm9yIiwiZm9ybWF0RGF0ZSIsIlJlc2VydmVkTW9kZWxzIiwicGFyc2VEYXRlIiwiSW50ZXJuYWxFcnJvciIsImZpbmRNb2RlbElkIiwiTW9kZWwiLCJSZWZsZWN0aW9uIiwibWV0YWRhdGEiLCJhcHBseSIsInByb3BNZXRhZGF0YSIsIk9wZXJhdGlvbktleXMiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7O0lBT0c7SUEwQkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBNENHO0FBQ1UsVUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBQSxPQUFPLEVBQUUsQ0FBQSxFQUFHQSw2QkFBUyxDQUFDLE9BQU8sQ0FBTSxJQUFBLENBQUE7SUFDbkMsSUFBQSxPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFBLFdBQVcsRUFBRSxhQUFhO0lBQzFCLElBQUEsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUEsS0FBSyxFQUFFLE9BQU87SUFDZCxJQUFBLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBQSxXQUFXLEVBQUUsUUFBUTtJQUNyQixJQUFBLFlBQVksRUFBRSx1QkFBdUI7SUFFckMsSUFBQSxVQUFVLEVBQUUsWUFBWTtJQUN4QixJQUFBLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLElBQUEsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBQSxZQUFZLEVBQUUsY0FBYztJQUM1QixJQUFBLFFBQVEsRUFBRSxVQUFVO0lBRXBCLElBQUEsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFBLFFBQVEsRUFBRSxTQUFTO0lBRW5CLElBQUEs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