ngx-material-entity 15.1.1 → 15.1.2

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.
Files changed (27) hide show
  1. package/classes/entity.utilities.d.ts +36 -0
  2. package/components/input/date/date-range-input/date-range-input.component.d.ts +6 -3
  3. package/components/input/date/date-time-input/date-time-input.component.d.ts +2 -1
  4. package/components/input/file/file-image-input/file-image-input.component.d.ts +4 -2
  5. package/components/input/file/file-input/file-input.component.d.ts +5 -2
  6. package/components/input/string/string-password-input/string-password-input.component.d.ts +2 -1
  7. package/decorators/base/base-property.decorator.d.ts +2 -1
  8. package/decorators/custom/custom.decorator.d.ts +2 -1
  9. package/encapsulation/reflect.utilities.d.ts +9 -0
  10. package/esm2020/classes/entity.utilities.mjs +44 -1
  11. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +21 -1
  12. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +9 -1
  13. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +3 -3
  14. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +17 -3
  15. package/esm2020/components/input/file/file-input/file-input.component.mjs +14 -2
  16. package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +8 -3
  17. package/esm2020/decorators/base/base-property.decorator.mjs +6 -2
  18. package/esm2020/decorators/custom/custom.decorator.mjs +4 -3
  19. package/esm2020/decorators/date/date.decorator.mjs +4 -3
  20. package/esm2020/decorators/file/file.decorator.mjs +4 -3
  21. package/esm2020/decorators/string/string.decorator.mjs +3 -2
  22. package/esm2020/encapsulation/reflect.utilities.mjs +12 -1
  23. package/fesm2015/ngx-material-entity.mjs +333 -225
  24. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  25. package/fesm2020/ngx-material-entity.mjs +330 -222
  26. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  27. package/package.json +1 -1
@@ -672,6 +672,13 @@ export class EntityUtilities {
672
672
  static resetChangesOnEntity(entity, entityPriorChanges) {
673
673
  for (const key in entityPriorChanges) {
674
674
  ReflectUtilities.set(entity, key, ReflectUtilities.get(entityPriorChanges, key));
675
+ if (ReflectUtilities.hasMetadata(this.METADATA_KEYS_TO_RESET_KEY, entity, key)) {
676
+ for (const k of ReflectUtilities.getMetadata(this.METADATA_KEYS_TO_RESET_KEY, entity, key)) {
677
+ if (ReflectUtilities.hasMetadata(k, entity, key)) {
678
+ ReflectUtilities.defineMetadata(k, undefined, entity, key);
679
+ }
680
+ }
681
+ }
675
682
  }
676
683
  }
677
684
  static getEntityRows(entity, tab, hideOmitForCreate, hideOmitForEdit) {
@@ -774,8 +781,44 @@ export class EntityUtilities {
774
781
  return keys;
775
782
  }
776
783
  }
784
+ /**
785
+ * The key for all keys of metadata that should be set to undefined when the entity gets reset.
786
+ */
787
+ EntityUtilities.METADATA_KEYS_TO_RESET_KEY = 'metadataKeysToReset';
788
+ /**
789
+ * The key for the metadata that saves the single preview image value on image properties.
790
+ */
791
+ EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY = 'singlePreviewImage';
792
+ /**
793
+ * The key for the metadata that saves the multi preview images value on image properties.
794
+ */
795
+ EntityUtilities.MULTI_PREVIEW_IMAGES_KEY = 'multiPreviewImages';
796
+ /**
797
+ * The key for the metadata that saves the filenames value on file properties.
798
+ */
799
+ EntityUtilities.FILENAMES_KEY = 'fileNames';
800
+ /**
801
+ * The key for the metadata that saves the confirm password value on password properties.
802
+ */
803
+ EntityUtilities.CONFIRM_PASSWORD_KEY = 'confirmPassword';
804
+ /**
805
+ * The key for the metadata that saves the time value on date time properties.
806
+ */
807
+ EntityUtilities.TIME_KEY = 'time';
808
+ /**
809
+ * The key for the metadata that saves the date range value on date range properties.
810
+ */
811
+ EntityUtilities.DATE_RANGE_KEY = 'dateRange';
812
+ /**
813
+ * The key for the metadata that saves the date range start value on date range properties.
814
+ */
815
+ EntityUtilities.DATE_RANGE_START_KEY = 'dateRangeStart';
816
+ /**
817
+ * The key for the metadata that saves the date range end value on date range properties.
818
+ */
819
+ EntityUtilities.DATE_RANGE_END_KEY = 'dateRangeEnd';
777
820
  // eslint-disable-next-line @typescript-eslint/member-ordering, jsdoc/require-jsdoc, @typescript-eslint/typedef
778
821
  EntityUtilities.construct = EntityUtilities.new;
779
822
  // eslint-disable-next-line @typescript-eslint/member-ordering, jsdoc/require-jsdoc, @typescript-eslint/typedef
780
823
  EntityUtilities.build = EntityUtilities.new;
781
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NsYXNzZXMvZW50aXR5LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBV3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBb0JqRDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZUFBZTtJQUVqQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxRQUFRLEdBQW9DLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkcsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxRQUFR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QUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxlQUFlLEVBQUU7WUFDakIsTUFBTSxpQkFBaUIsR0FBeUIsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pGLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O0FBeHZCRCwrR0FBK0c7QUFDeEcseUJBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO0FBQ3ZDLCtHQUErRztBQUN4RyxxQkFBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYXJyYXkvYXJyYXktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBUb2dnbGVCb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jvb2xlYW4vYm9vbGVhbi1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvY3VzdG9tL2N1c3RvbS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBEZWZhdWx0RGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9kYXRlL2RhdGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9kYXRlL2RhdGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9udW1iZXIvbnVtYmVyLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvc3RyaW5nL3N0cmluZy1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4vZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBGaWxlVXRpbGl0aWVzIH0gZnJvbSAnLi9maWxlLnV0aWxpdGllcyc7XG5cbi8qKlxuICogU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gZW50aXRpZXMuXG4gKi9cbmludGVyZmFjZSBEaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hlcmUgdGhlIHR3byBlbnRpdGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAgICovXG4gICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgYmVmb3JlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGFmdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWZ0ZXI6IHVua25vd25cbn1cblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBFbnRpdGllcyBhbmQgdGhlaXIgcHJvcGVydHktbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gdXBkYXRpbmcgdGhlIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciB1cGRhdGluZyBhbiBFbnRpdHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldE9taXRGb3JVcGRhdGU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHkpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIGNyZWF0aW5nIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciBjcmVhdGluZyBhIG5ldyBFbnRpdHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldE9taXRGb3JDcmVhdGU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHkpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eSB3aGljaCBhcmUgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBjaGVjayBmb3IgZmlsZSBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB0byBsZWF2ZSBvdXQgdmFsdWVzIHRoYXQgYXJlIG9taXR0ZWQgZm9yIGNyZWF0ZSBvciBkZWxldGUuXG4gICAgICogQHJldHVybnMgVGhlIGtleXMgb2YgYWxsIGZpbGUgcHJvcGVydGllcyBvbiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGaWxlUHJvcGVydGllczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIG9taXQ/OiAnY3JlYXRlJyB8ICd1cGRhdGUnXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQgfHwgdHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUgJiYgb21pdCA9PT0gJ2NyZWF0ZScpICYmICEobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBpbmNsdWRlZCBpbiBhbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBGb3Igc2VjdXJlIFR5cGluZywgZGVmaW5lcyB0aGUgcmV0dXJuZWQgUHJvcGVydHlDb25maWcuXG4gICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5TWV0YWRhdGE8XG4gICAgICAgIEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPixcbiAgICAgICAgVCBleHRlbmRzIERlY29yYXRvclR5cGVzLFxuICAgICAgICBDdXN0b21NZXRhZGF0YVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgdHlwZT86IFRcbiAgICApOiBEZWNvcmF0b3JUeXBlPFQsIEN1c3RvbU1ldGFkYXRhVHlwZT4ge1xuICAgICAgICBjb25zdCBtZXRhZGF0YTogdW5rbm93biA9IFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ21ldGFkYXRhJywgZW50aXR5LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eUtleSl9IG9uIHRoZSBlbnRpdHkgJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhIGFzIERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRW50aXR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5VHlwZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlXG4gICAgKTogRGVjb3JhdG9yVHlwZXMge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlUeXBlOiB1bmtub3duID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgndHlwZScsIGVudGl0eSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgdHlwZSBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVR5cGUgYXMgRGVjb3JhdG9yVHlwZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHR5cGUgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIHByb3BlcnR5IHZhbHVlcyBiYXNlZCBvbiBhIGdpdmVuIGVudGl0eSBkYXRhLW9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkIChpZiBjYWxsZWQgaW5zaWRlIGFuIEVudGl0eSBjb25zdHJ1Y3RvciBpdHMgdXN1YWxseSB0aGlzKS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGRhdGEgb2JqZWN0IHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWVzIGZyb20uXG4gICAgICogQGFsaWFzIG5ld1xuICAgICAqIEBhbGlhcyBidWlsZFxuICAgICAqIEBhbGlhcyBjb25zdHJ1Y3RcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV3PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4odGFyZ2V0OiBFbnRpdHlUeXBlLCBlbnRpdHk/OiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTogdW5rbm93biA9IGVudGl0eSA/IFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eSwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RNZXRhZGF0YTogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT5cbiAgICAgICAgICAgICAgICAgICAgICAgID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLk9CSkVDVCk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IG9iamVjdE1ldGFkYXRhLkVudGl0eUNsYXNzKHZhbHVlIGFzIG9iamVjdCB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0QXJyYXk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCA9IHZhbHVlIGFzIEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzQXJyYXk6IEVudGl0eVR5cGVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5TWV0YWRhdGE6IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLkFSUkFZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVdpdGhNZXRhZGF0YTogRW50aXR5VHlwZSA9IG5ldyBhcnJheU1ldGFkYXRhLkVudGl0eUNsYXNzKGl0ZW0pIGFzIEVudGl0eVR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyYXkucHVzaChpdGVtV2l0aE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc0FycmF5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcsIGpzZG9jL3JlcXVpcmUtanNkb2MsIEB0eXBlc2NyaXB0LWVzbGludC90eXBlZGVmXG4gICAgc3RhdGljIGNvbnN0cnVjdCA9IEVudGl0eVV0aWxpdGllcy5uZXc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcsIGpzZG9jL3JlcXVpcmUtanNkb2MsIEB0eXBlc2NyaXB0LWVzbGludC90eXBlZGVmXG4gICAgc3RhdGljIGJ1aWxkID0gRW50aXR5VXRpbGl0aWVzLm5ldztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWVzIG9uIGFuIGVudGl0eSBhcmUgdmFsaWQuXG4gICAgICogQWxzbyBjaGVja3MgYWxsIHRoZSB2YWxpZGF0b3JzIGdpdmVuIGJ5IHRoZSBtZXRhZGF0YSAoXCJyZXF1aXJlZFwiLCBcIm1heExlbmd0aFwiIGV0Yy4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gdmFsaWRhdGUuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGNoZWNrIGZvciBjcmVhdGluZyBvciBlZGl0aW5nIHZhbGlkaXR5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgdmFsaWQuXG4gICAgICovXG4gICAgc3RhdGljIGlzRW50aXR5VmFsaWQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIG9taXQ6ICdjcmVhdGUnIHwgJ3VwZGF0ZScpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Byb3BlcnR5VmFsaWQoZW50aXR5LCBrZXksIG9taXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aGVyZSB0aGUgcHJvcGVydHkgaXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZ2l2ZW4gZW50aXR5IGlzIHZhbGlkIGZvciBjcmVhdGlvbiBvciB1cGRhdGluZy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdmFsaWQuXG4gICAgICogQHRocm93cyBUaHJvd3Mgd2hlbiBpdCBleHRyYWN0cyBhbiB1bmtub3duIG1ldGFkYXRhIHR5cGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNQcm9wZXJ0eVZhbGlkPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBvbWl0OiAnY3JlYXRlJyB8ICd1cGRhdGUnXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXksIHR5cGUpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlICYmIG9taXQgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBpZiAoZW50aXR5W2tleV0gPT0gbnVsbCB8fCBlbnRpdHlba2V5XSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fRFJPUERPV046XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1g6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fVE9HR0xFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUJvb2xlYW46IGJvb2xlYW4gPSBlbnRpdHlba2V5XSBhcyBib29sZWFuO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvb2xlYW5NZXRhZGF0YTogVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzQm9vbGVhblZhbGlkKGVudGl0eUJvb2xlYW4sIGJvb2xlYW5NZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkc6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19BVVRPQ09NUExFVEU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5U3RyaW5nOiBzdHJpbmcgPSBlbnRpdHlba2V5XSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nTWV0YWRhdGE6IERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1N0cmluZ1ZhbGlkKGVudGl0eVN0cmluZywgc3RyaW5nTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19URVhUQk9YOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eVRleHRib3g6IHN0cmluZyA9IGVudGl0eVtrZXldIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Ym94TWV0YWRhdGE6IFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1RleHRib3hWYWxpZChlbnRpdHlUZXh0Ym94LCB0ZXh0Ym94TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19QQVNTV09SRDpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlQYXNzd29yZDogc3RyaW5nID0gZW50aXR5W2tleV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkTWV0YWRhdGE6IFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBQYXNzd29yZFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1QYXNzd29yZDogc3RyaW5nID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgnY29uZmlybVBhc3N3b3JkJywgZW50aXR5LCBrZXkpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Bhc3N3b3JkVmFsaWQoZW50aXR5UGFzc3dvcmQsIHBhc3N3b3JkTWV0YWRhdGEsIGNvbmZpcm1QYXNzd29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuTlVNQkVSX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk5VTUJFUl9TTElERVI6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5TnVtYmVyOiBudW1iZXIgPSBlbnRpdHlba2V5XSBhcyBudW1iZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyTWV0YWRhdGE6IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc051bWJlclZhbGlkKGVudGl0eU51bWJlciwgbnVtYmVyTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlPYmplY3Q6IEVudGl0eVR5cGUgPSBlbnRpdHlba2V5XSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyS2V5IGluIGVudGl0eU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Byb3BlcnR5VmFsaWQoZW50aXR5T2JqZWN0LCBwYXJhbWV0ZXJLZXksIG9taXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9USU1FOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1JBTkdFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlBcnJheTogdW5rbm93bltdID0gZW50aXR5W2tleV0gYXMgdW5rbm93bltdO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlNZXRhZGF0YTogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPiA9IG1ldGFkYXRhIGFzIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5TWV0YWRhdGEucmVxdWlyZWQgJiYgIWVudGl0eUFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eURhdGU6IERhdGUgPSBuZXcgRGF0ZShlbnRpdHlba2V5XSBhcyBEYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlTWV0YWRhdGE6IERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEZWZhdWx0RGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRGF0ZVZhbGlkKGVudGl0eURhdGUsIGRhdGVNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEYXRlUmFuZ2U6IERhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZW50aXR5W2tleV0gYXMgRGF0ZVJhbmdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlUmFuZ2VNZXRhZGF0YTogRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRGF0ZVJhbmdlVmFsaWQoZW50aXR5RGF0ZVJhbmdlLCBkYXRlUmFuZ2VNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eURhdGVUaW1lOiBEYXRlID0gbmV3IERhdGUoZW50aXR5W2tleV0gYXMgRGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVNZXRhZGF0YTogRGF0ZVRpbWVEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0RhdGVUaW1lVmFsaWQoZW50aXR5RGF0ZVRpbWUsIGRhdGVUaW1lTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVDpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlGaWxlOiBGaWxlRGF0YSB8IEZpbGVEYXRhW10gPSBlbnRpdHlba2V5XSBhcyBGaWxlRGF0YSB8IEZpbGVEYXRhW107XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RmlsZU1ldGFkYXRhOiBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0ZpbGVEYXRhVmFsaWQoZW50aXR5RmlsZSwgZW50aXR5RmlsZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX01BTlk6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkNVU1RPTTpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgbWF4LWxlblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbU1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBhbnksIGFueSwgYW55PiA9IG1ldGFkYXRhIGFzIEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGUsIGFueSwgYW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGlmICghY3VzdG9tTWV0YWRhdGEuaXNWYWxpZChlbnRpdHlba2V5XSwgb21pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmFsaWRhdGUgdGhlIGlucHV0IGJlY2F1c2UgdGhlIERlY29yYXRvclR5cGUgJHt0eXBlfSBpcyBub3Qga25vd25gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0Jvb2xlYW5WYWxpZCh2YWx1ZTogYm9vbGVhbiwgbWV0YWRhdGE6IFRvZ2dsZUJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEucmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNTdHJpbmdWYWxpZCh2YWx1ZTogc3RyaW5nLCBtZXRhZGF0YTogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWV0YWRhdGEubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtZXRhZGF0YS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEucmVnZXggJiYgIXZhbHVlLm1hdGNoKG1ldGFkYXRhLnJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzVGV4dGJveFZhbGlkKHZhbHVlOiBzdHJpbmcsIG1ldGFkYXRhOiBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtZXRhZGF0YS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzUGFzc3dvcmRWYWxpZCh2YWx1ZTogc3RyaW5nLCBtZXRhZGF0YTogUGFzc3dvcmRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgY29uZmlybVBhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBjb25maXJtUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1ldGFkYXRhLm1heExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWV0YWRhdGEubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlZ2V4ICYmICF2YWx1ZS5tYXRjaChtZXRhZGF0YS5yZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc051bWJlclZhbGlkKHZhbHVlOiBudW1iZXIsIG1ldGFkYXRhOiBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heCAmJiB2YWx1ZSA+IG1ldGFkYXRhLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW4gJiYgdmFsdWUgPCBtZXRhZGF0YS5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0RhdGVWYWxpZCh2YWx1ZTogRGF0ZSwgbWV0YWRhdGE6IERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbiAmJiB2YWx1ZS5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW4odmFsdWUpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXggJiYgdmFsdWUuZ2V0VGltZSgpID4gbWV0YWRhdGEubWF4KHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyICYmICFtZXRhZGF0YS5maWx0ZXIodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNEYXRlUmFuZ2VWYWxpZCh2YWx1ZTogRGF0ZVJhbmdlLCBtZXRhZGF0YTogRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUuc3RhcnQgYXMgRGF0ZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh2YWx1ZS5lbmQgYXMgRGF0ZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuc3RhcnQgPSBuZXcgRGF0ZSh2YWx1ZS5zdGFydCk7XG4gICAgICAgIHZhbHVlLmVuZCA9IG5ldyBEYXRlKHZhbHVlLmVuZCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5TdGFydCAmJiB2YWx1ZS5zdGFydC5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5TdGFydCh2YWx1ZS5zdGFydCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heFN0YXJ0ICYmIHZhbHVlLnN0YXJ0LmdldFRpbWUoKSA+IG1ldGFkYXRhLm1heFN0YXJ0KHZhbHVlLnN0YXJ0KS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluRW5kICYmIHZhbHVlLmVuZC5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5FbmQodmFsdWUuZW5kKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4RW5kICYmIHZhbHVlLmVuZC5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXhFbmQodmFsdWUuZW5kKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlcih2YWx1ZS5zdGFydCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlcih2YWx1ZS5lbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0ZSBvZiB2YWx1ZS52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5maWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0RhdGVUaW1lVmFsaWQodmFsdWU6IERhdGUsIG1ldGFkYXRhOiBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEubWluRGF0ZSAmJiB2YWx1ZS5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5EYXRlKHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4RGF0ZSAmJiB2YWx1ZS5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXhEYXRlKHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyRGF0ZSAmJiAhbWV0YWRhdGEuZmlsdGVyRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lOiBUaW1lID0ge1xuICAgICAgICAgICAgaG91cnM6IHZhbHVlLmdldEhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiB2YWx1ZS5nZXRNaW51dGVzKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pblRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblRpbWU6IFRpbWUgPSBtZXRhZGF0YS5taW5UaW1lKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID4gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID09PSBtaW5UaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lLm1pbnV0ZXMgPj0gbWluVGltZS5taW51dGVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heFRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFRpbWU6IFRpbWUgPSBtZXRhZGF0YS5tYXhUaW1lKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzIDwgbWF4VGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID09PSBtYXhUaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lLm1pbnV0ZXMgPD0gbWF4VGltZS5taW51dGVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlclRpbWUpIHtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmlsdGVyVGltZSh0aW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0ZpbGVEYXRhVmFsaWQodmFsdWU6IEZpbGVEYXRhIHwgRmlsZURhdGFbXSwgbWV0YWRhdGE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVEYXRhW10gPSBtZXRhZGF0YS5tdWx0aXBsZSA/IHZhbHVlIGFzIEZpbGVEYXRhW10gOiBbdmFsdWUgYXMgRmlsZURhdGFdO1xuICAgICAgICBsZXQgZmlsZVNpemVUb3RhbDogbnVtYmVyID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIWZpbGUubmFtZSB8fCAhZmlsZS5maWxlICYmICFmaWxlLnVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghRmlsZVV0aWxpdGllcy5pc01pbWVUeXBlVmFsaWQoZmlsZS50eXBlLCBtZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGZpbGUuc2l6ZSwgJ0InKSA+IG1ldGFkYXRhLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlU2l6ZVRvdGFsICs9IGZpbGUuc2l6ZTtcbiAgICAgICAgICAgIGlmIChGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGZpbGVTaXplVG90YWwsICdCJykgPiBtZXRhZGF0YS5tYXhTaXplVG90YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIGVudGl0eSBpcyBcImRpcnR5XCIgKGlmIGl0cyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IGFmdGVyIGFsbCBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0RpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGVudGl0eVByaW9yQ2hhbmdlcyBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZXM6IERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXSA9IGF3YWl0IEVudGl0eVV0aWxpdGllcy5kaWZmZXJlbmNlc0ZvckRpcnR5KGVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIHJldHVybiBkaWZmZXJlbmNlcy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBkaWZmZXJlbmNlc0ZvckRpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlXG4gICAgKTogUHJvbWlzZTxEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10+IHtcbiAgICAgICAgY29uc3QgcmVzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKGVudGl0eVtrZXldLCBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSwgbWV0YWRhdGEsIHR5cGUpKSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBlbnRpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gc2V0IGJsb2IgZmlsZSBkYXRhIHNvIHRoYXQgaXQgaXMgb25seSByZXF1ZXN0ZWQgb25jZS5cbiAgICAgICAgICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZW50aXR5W2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIEVudGl0aWVzIGFuZCByZXR1cm5zIHRoZWlyIGRpZmZlcmVuY2UgaW4gYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBmaXJzdCBlbnRpdHkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIHNlY29uZCBlbnRpdHkgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gRW50aXRpZXMgaW4gZm9ybSBvZiBhIFBhcnRpYWwuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGRpZmZlcmVuY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPFBhcnRpYWw8RW50aXR5VHlwZT4+IHtcbiAgICAgICAgY29uc3QgcmVzOiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSkpKSB7XG4gICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnRpdHlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0d28gZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgKiBJdCB1c2VzIHRoZSBpc0VxdWFsIG1ldGhvZCBmcm9tIExvZGFzaFV0aWxpdGllcyBhbmQgZXh0ZW5kcyBpdCB3aXRoIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIERhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlUHJpb3JDaGFuZ2VzIC0gVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0VxdWFsKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsLFxuICAgICAgICB0eXBlOiBEZWNvcmF0b3JUeXBlc1xuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCkuZmlsdGVyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlVGltZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQXJyYXlEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsRmlsZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIChtZXRhZGF0YSBhcyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5tdWx0aXBsZSk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkNVU1RPTTpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbEN1c3RvbSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIG1ldGFkYXRhIGFzIEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueSwgYW55LCBhbnksIGFueT4pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzdHJpbmdBcnJheTogc3RyaW5nW10gPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlIGFzIHN0cmluZ1tdKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzOiBzdHJpbmdbXSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgc3RyaW5nW10pLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHN0cmluZ0FycmF5LCBzdHJpbmdBcnJheVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5RGF0ZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWU6IERhdGVbXSA9ICh2YWx1ZSBhcyBEYXRlW10pLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlUHJpb3JDaGFuZ2VzOiBEYXRlW10gPSAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVtdKS5tYXAodiA9PiBuZXcgRGF0ZSh2KSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwobmV3VmFsdWUsIG5ld1ZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlczogRGF0ZVJhbmdlW10gPSAodmFsdWUgYXMgRGF0ZVJhbmdlW10pLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlczogRGF0ZVJhbmdlW10gPSAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVJhbmdlW10pLnNvcnQoKTtcbiAgICAgICAgaWYgKGRhdGVSYW5nZXMubGVuZ3RoICE9PSBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkYXRlUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0VxdWFsRGF0ZVJhbmdlKGRhdGVSYW5nZXNbaV0sIGRhdGVSYW5nZXNQcmlvckNoYW5nZXNbaV0sIGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVUaW1lKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgZGF0ZVByaW9yQ2hhbmdlcy5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlOiBEYXRlUmFuZ2UgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlKSBhcyBEYXRlUmFuZ2U7XG4gICAgICAgIGRhdGVSYW5nZS5zdGFydCA9IG5ldyBEYXRlKCh2YWx1ZSBhcyBEYXRlUmFuZ2UpLnN0YXJ0KTtcbiAgICAgICAgZGF0ZVJhbmdlLmVuZCA9IG5ldyBEYXRlKCh2YWx1ZSBhcyBEYXRlUmFuZ2UpLmVuZCk7XG4gICAgICAgIGRhdGVSYW5nZS52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgIGRhdGVSYW5nZS5zdGFydCxcbiAgICAgICAgICAgIGRhdGVSYW5nZS5lbmQsXG4gICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2UgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzKSBhcyBEYXRlUmFuZ2U7XG4gICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCA9IG5ldyBEYXRlKCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2UpLnN0YXJ0KTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCA9IG5ldyBEYXRlKCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2UpLmVuZCk7XG4gICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCxcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQsXG4gICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGVSYW5nZSwgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGlzRXF1YWxGaWxlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgbXVsdGlwbGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZSBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWUgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZmlsZXNQcmlvckNoYW5nZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWVQcmlvckNoYW5nZXMgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gZmlsZXNQcmlvckNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgdGhpcyBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyBhbnkgZmlsZXMgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzW2ldLCAnZmlsZScpLCBMb2Rhc2hVdGlsaXRpZXMub21pdChmaWxlc1ByaW9yQ2hhbmdlc1tpXSwgJ2ZpbGUnKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZSAmJiAhZmlsZXNbaV0uZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShmaWxlc1tpXSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1tpXS5maWxlICYmICFmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNQcmlvckNoYW5nZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzUHJpb3JDaGFuZ2VzW2ldKTtcbiAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyA9IGZpbGVzUHJpb3JDaGFuZ2VzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChhd2FpdCBmaWxlc1tpXS5maWxlPy50ZXh0KCksIGF3YWl0IGZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGU/LnRleHQoKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEN1c3RvbShcbiAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBtZXRhZGF0YTogQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55LCBhbnksIGFueSwgYW55PlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW1ldGFkYXRhLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGVudGl0eSBrZXlzIGJ5IHRoZWlyIG9yZGVyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGEgLSBGaXJzdCBrZXkgb2YgZW50aXR5LlxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEN1cnJlbnQgZW50aXR5ICh1c2VkIHRvIGdldCBtZXRhZGF0YSBvZiBlbnRpdHkga2V5cykuXG4gICAgICogQHJldHVybnMgMCBpZiBib3RoIHZhbHVlcyBoYXZlIHRoZSBzYW1lIG9yZGVyLCBhIG5lZ2F0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWZvcmUgJ2InLCBhIHBvc2l0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWhpbmQgJ2InLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlT3JkZXI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgYToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgYjoga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFBOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBhKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFCOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBiKTtcblxuICAgICAgICBpZiAobWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyIC0gbWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZvciBcImxnXCIsIFwibWRcIiwgXCJzbVwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEVudGl0eSB0byBnZXQgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIG9mIHRoZSBrZXkuXG4gICAgICogQHBhcmFtIGtleSAtIEtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0IGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBEZWZpbmVzIGZvciB3aGljaCBzY3JlZW4gc2l6ZSB0aGUgY29sdW1uIHZhbHVlcyBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAgICogQHJldHVybnMgQm9vdHN0cmFwIGNvbHVtbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2lkdGg8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsIHR5cGU6ICdsZycgfCAnbWQnIHwgJ3NtJ1xuICAgICk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1swXTtcbiAgICAgICAgICAgIGNhc2UgJ21kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1sxXTtcbiAgICAgICAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1syXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgY2hhbmdlcyBvbiBhbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byByZXNldC5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIGVudGl0eSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlc2V0Q2hhbmdlc09uRW50aXR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlLCBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5UHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLnNldChlbnRpdHksIGtleSwgUmVmbGVjdFV0aWxpdGllcy5nZXQoZW50aXR5UHJpb3JDaGFuZ2VzLCBrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEVudGl0eVJvd3M8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4sXG4gICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogYm9vbGVhblxuICAgICk6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHksIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlJvd3M6IG51bWJlciA9IEVudGl0eVV0aWxpdGllcy5nZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCB0YWIpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG51bWJlck9mUm93czsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IGksXG4gICAgICAgICAgICAgICAga2V5czogRW50aXR5VXRpbGl0aWVzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCBpLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIC0xLCB0YWIpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdFJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogbnVtYmVyT2ZSb3dzICsgMSxcbiAgICAgICAgICAgICAgICBrZXlzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIC0xLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gobGFzdFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRhYnMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5IHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHJvd3MgZnJvbS5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgVGhlIHNvcnRlZCBUYWJzIGNvbnRhaW5pbmcgdGhlIHJvd3MgYW5kIHRoZSBrZXlzIHRvIGRpc3BsYXkgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAgc3RhdGljIGdldEVudGl0eVRhYnM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5LCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZUYWJzOiBudW1iZXIgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSk7XG5cbiAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KGVudGl0eSwgLTEsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RUYWI6IEVudGl0eVRhYjxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICB0YWJOYW1lOiBFbnRpdHlVdGlsaXRpZXMuZ2V0Rmlyc3RUYWJOYW1lKGVudGl0eSksXG4gICAgICAgICAgICAgICAgdGFiOiAtMSxcbiAgICAgICAgICAgICAgICByb3dzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlPihlbnRpdHksIC0xLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZpcnN0VGFiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPD0gbnVtYmVyT2ZUYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHRhYk5hbWU6IEVudGl0eVV0aWxpdGllcy5nZXRUYWJOYW1lKGVudGl0eSwgaSksXG4gICAgICAgICAgICAgICAgdGFiOiBpLFxuICAgICAgICAgICAgICAgIHJvd3M6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KGVudGl0eSwgaSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaCh0YWIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLZXlzRm9yUm93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnJvdyA9PT0gcm93KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24udGFiID09PSB0YWIpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gRW50aXR5VXRpbGl0aWVzLmNvbXBhcmVPcmRlcihhLCBiLCBlbnRpdHkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24udGFiID09PSB0YWIpXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi5yb3cpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEgPiBiID8gLTEgOiAxKSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oa2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sIGVudGl0eTogRW50aXR5VHlwZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBrZXlzXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEgPiBiID8gLTEgOiAxKSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgdGFiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KVxuICAgICAgICAgICAgLm1hcChrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0ucG9zaXRpb24udGFiID09PSB0YWIgJiYgbS5wb3NpdGlvbi50YWJOYW1lKT8ucG9zaXRpb24udGFiTmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVkVGFiTmFtZSA/PyBgVGFiICR7dGFifWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rmlyc3RUYWJOYW1lPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZWRUYWJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSlcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspKVxuICAgICAgICAgICAgLmZpbmQobSA9PiBtLnBvc2l0aW9uLnRhYk5hbWUgJiYgbS5wb3NpdGlvbi50YWIgPT09IC0xKT8ucG9zaXRpb24udGFiTmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVkVGFiTmFtZSA/PyAnVGFiIDEnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIGVudGl0eSBjb3JyZWN0bHkgdHlwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIGtleXMgb2YuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yQ3JlYXRlIC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yQ3JlYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yRWRpdCAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvclVwZGF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGtleXMgb2YgdGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMga2V5c09mPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2VcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGxldCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpO1xuICAgICAgICBpZiAoaGlkZU9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JDcmVhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSk7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhb21pdEZvckNyZWF0ZUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRlT21pdEZvckVkaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JVcGRhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yVXBkYXRlKGVudGl0eSk7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhb21pdEZvclVwZGF0ZUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHJvdyB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbiB3aGljaCB0aGlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcm93OiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW11cbn1cblxuLyoqXG4gKiBBIHRhYiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVRhYjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluIHdoaWNoIHRoZSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgdGFiOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRhYi5cbiAgICAgKi9cbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluc2lkZSB0aGlzIHRhYiwuXG4gICAgICovXG4gICAgcm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W11cbn0iXX0=
824
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NsYXNzZXMvZW50aXR5LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBV3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBb0JqRDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZUFBZTtJQStDakM7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlDLE1BQU0sUUFBUSxHQUFvQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25HLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqQjtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlDLE1BQU0sUUFB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LG9DQUFvQixHQUFXLGdCQUFnQixDQUFDO0FBRWhFOztHQUVHO0FBQ2Esa0NBQWtCLEdBQVcsY0FBYyxDQUFDO0FBMko1RCwrR0FBK0c7QUFDeEcseUJBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO0FBQ3ZDLCtHQUErRztBQUN4RyxxQkFBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYXJyYXkvYXJyYXktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBUb2dnbGVCb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jvb2xlYW4vYm9vbGVhbi1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvY3VzdG9tL2N1c3RvbS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBEZWZhdWx0RGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9kYXRlL2RhdGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9kYXRlL2RhdGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9udW1iZXIvbnVtYmVyLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvc3RyaW5nL3N0cmluZy1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4vZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBGaWxlVXRpbGl0aWVzIH0gZnJvbSAnLi9maWxlLnV0aWxpdGllcyc7XG5cbi8qKlxuICogU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gZW50aXRpZXMuXG4gKi9cbmludGVyZmFjZSBEaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hlcmUgdGhlIHR3byBlbnRpdGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAgICovXG4gICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgYmVmb3JlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGFmdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWZ0ZXI6IHVua25vd25cbn1cblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBFbnRpdGllcyBhbmQgdGhlaXIgcHJvcGVydHktbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgYWxsIGtleXMgb2YgbWV0YWRhdGEgdGhhdCBzaG91bGQgYmUgc2V0IHRvIHVuZGVmaW5lZCB3aGVuIHRoZSBlbnRpdHkgZ2V0cyByZXNldC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVk6IHN0cmluZyA9ICdtZXRhZGF0YUtleXNUb1Jlc2V0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBzaW5nbGUgcHJldmlldyBpbWFnZSB2YWx1ZSBvbiBpbWFnZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUFJFVklFV19JTUFHRV9LRVk6IHN0cmluZyA9ICdzaW5nbGVQcmV2aWV3SW1hZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIG11bHRpIHByZXZpZXcgaW1hZ2VzIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IE1VTFRJX1BSRVZJRVdfSU1BR0VTX0tFWTogc3RyaW5nID0gJ211bHRpUHJldmlld0ltYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgZmlsZW5hbWVzIHZhbHVlIG9uIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgRklMRU5BTUVTX0tFWTogc3RyaW5nID0gJ2ZpbGVOYW1lcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgY29uZmlybSBwYXNzd29yZCB2YWx1ZSBvbiBwYXNzd29yZCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBDT05GSVJNX1BBU1NXT1JEX0tFWTogc3RyaW5nID0gJ2NvbmZpcm1QYXNzd29yZCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgdGltZSB2YWx1ZSBvbiBkYXRlIHRpbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgVElNRV9LRVk6IHN0cmluZyA9ICd0aW1lJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBkYXRlIHJhbmdlIHZhbHVlIG9uIGRhdGUgcmFuZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgREFURV9SQU5HRV9LRVk6IHN0cmluZyA9ICdkYXRlUmFuZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIGRhdGUgcmFuZ2Ugc3RhcnQgdmFsdWUgb24gZGF0ZSByYW5nZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBEQVRFX1JBTkdFX1NUQVJUX0tFWTogc3RyaW5nID0gJ2RhdGVSYW5nZVN0YXJ0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBkYXRlIHJhbmdlIGVuZCB2YWx1ZSBvbiBkYXRlIHJhbmdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IERBVEVfUkFOR0VfRU5EX0tFWTogc3RyaW5nID0gJ2RhdGVSYW5nZUVuZCc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgd2hlbiB1cGRhdGluZyB0aGUgZW50aXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGFuIEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvclVwZGF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIGNyZWF0aW5nIGEgbmV3IEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvckNyZWF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcHJvcGVydGllcyBvbiB0aGUgZ2l2ZW4gZW50aXR5IHdoaWNoIGFyZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGNoZWNrIGZvciBmaWxlIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGxlYXZlIG91dCB2YWx1ZXMgdGhhdCBhcmUgb21pdHRlZCBmb3IgY3JlYXRlIG9yIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldEZpbGVQcm9wZXJ0aWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgb21pdD86ICdjcmVhdGUnIHwgJ3VwZGF0ZSdcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHkpKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVCB8fCB0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCEobWV0YWRhdGEub21pdEZvckNyZWF0ZSAmJiBvbWl0ID09PSAnY3JlYXRlJykgJiYgIShtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlICYmIG9taXQgPT09ICd1cGRhdGUnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGluY2x1ZGVkIGluIGFuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCB0aGUgcHJvcGVydHkgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmcm9tLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRW50aXR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIEZvciBzZWN1cmUgVHlwaW5nLCBkZWZpbmVzIHRoZSByZXR1cm5lZCBQcm9wZXJ0eUNvbmZpZy5cbiAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBtZXRhZGF0YSBjYW4gYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJvcGVydHlNZXRhZGF0YTxcbiAgICAgICAgRW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+LFxuICAgICAgICBUIGV4dGVuZHMgRGVjb3JhdG9yVHlwZXMsXG4gICAgICAgIEN1c3RvbU1ldGFkYXRhVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgPihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBwcm9wZXJ0eUtleToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB0eXBlPzogVFxuICAgICk6IERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPiB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiB1bmtub3duID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgnbWV0YWRhdGEnLCBlbnRpdHksIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEgYXMgRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LW1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCB0aGUgcHJvcGVydHkgdG8gZ2V0IHRoZSB0eXBlIGZyb20uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBFbnRpdHkgdG8gZ2V0IHRoZSB0eXBlIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhLlxuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBubyBtZXRhZGF0YSBjYW4gYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJvcGVydHlUeXBlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSwgcHJvcGVydHlLZXk6IGtleW9mIEVudGl0eVR5cGVcbiAgICApOiBEZWNvcmF0b3JUeXBlcyB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVR5cGU6IHVua25vd24gPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKCd0eXBlJywgZW50aXR5LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICBpZiAocHJvcGVydHlUeXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCB0eXBlIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eUtleSl9IG9uIHRoZSBlbnRpdHkgJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VHlwZSBhcyBEZWNvcmF0b3JUeXBlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgdHlwZSBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhbGwgcHJvcGVydHkgdmFsdWVzIGJhc2VkIG9uIGEgZ2l2ZW4gZW50aXR5IGRhdGEtb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgY29uc3RydWN0ZWQgKGlmIGNhbGxlZCBpbnNpZGUgYW4gRW50aXR5IGNvbnN0cnVjdG9yIGl0cyB1c3VhbGx5IHRoaXMpLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvYmplY3QgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAYWxpYXMgbmV3XG4gICAgICogQGFsaWFzIGJ1aWxkXG4gICAgICogQGFsaWFzIGNvbnN0cnVjdFxuICAgICAqL1xuICAgIHN0YXRpYyBuZXc8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+Pih0YXJnZXQ6IEVudGl0eVR5cGUsIGVudGl0eT86IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGFyZ2V0LCBrZXkpO1xuICAgICAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gZW50aXR5ID8gUmVmbGVjdFV0aWxpdGllcy5nZXQoZW50aXR5LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdE1ldGFkYXRhOiBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0YXJnZXQsIGtleSwgRGVjb3JhdG9yVHlwZXMuT0JKRUNUKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgb2JqZWN0TWV0YWRhdGEuRW50aXR5Q2xhc3ModmFsdWUgYXMgb2JqZWN0IHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRBcnJheTogRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkID0gdmFsdWUgYXMgRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNBcnJheTogRW50aXR5VHlwZVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlNZXRhZGF0YTogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0YXJnZXQsIGtleSwgRGVjb3JhdG9yVHlwZXMuQVJSQVkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtV2l0aE1ldGFkYXRhOiBFbnRpdHlUeXBlID0gbmV3IGFycmF5TWV0YWRhdGEuRW50aXR5Q2xhc3MoaXRlbSkgYXMgRW50aXR5VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNBcnJheS5wdXNoKGl0ZW1XaXRoTWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVkZWZcbiAgICBzdGF0aWMgY29uc3RydWN0ID0gRW50aXR5VXRpbGl0aWVzLm5ldztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVkZWZcbiAgICBzdGF0aWMgYnVpbGQgPSBFbnRpdHlVdGlsaXRpZXMubmV3O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZXMgb24gYW4gZW50aXR5IGFyZSB2YWxpZC5cbiAgICAgKiBBbHNvIGNoZWNrcyBhbGwgdGhlIHZhbGlkYXRvcnMgZ2l2ZW4gYnkgdGhlIG1ldGFkYXRhIChcInJlcXVpcmVkXCIsIFwibWF4TGVuZ3RoXCIgZXRjLikuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byB2YWxpZGF0ZS5cbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGNyZWF0aW5nIG9yIGVkaXRpbmcgdmFsaWRpdHkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNFbnRpdHlWYWxpZDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgb21pdDogJ2NyZWF0ZScgfCAndXBkYXRlJyk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzUHJvcGVydHlWYWxpZChlbnRpdHksIGtleSwgb21pdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHNpbmdsZSBwcm9wZXJ0eSB2YWx1ZSBpcyB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdoZXJlIHRoZSBwcm9wZXJ0eSBpcyBmcm9tLlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBlbnRpdHkgaXMgdmFsaWQgZm9yIGNyZWF0aW9uIG9yIHVwZGF0aW5nLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB2YWxpZC5cbiAgICAgKiBAdGhyb3dzIFRocm93cyB3aGVuIGl0IGV4dHJhY3RzIGFuIHVua25vd24gbWV0YWRhdGEgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBpc1Byb3BlcnR5VmFsaWQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIG9taXQ6ICdjcmVhdGUnIHwgJ3VwZGF0ZSdcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUgJiYgb21pdCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlICYmIG9taXQgPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHlba2V5XSA9PSBudWxsIHx8IGVudGl0eVtrZXldID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9EUk9QRE9XTjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9DSEVDS0JPWDpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9UT0dHTEU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5Qm9vbGVhbjogYm9vbGVhbiA9IGVudGl0eVtrZXldIGFzIGJvb2xlYW47XG4gICAgICAgICAgICAgICAgY29uc3QgYm9vbGVhbk1ldGFkYXRhOiBUb2dnbGVCb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBUb2dnbGVCb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNCb29sZWFuVmFsaWQoZW50aXR5Qm9vbGVhbiwgYm9vbGVhbk1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkdfRFJPUERPV046XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklORzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0FVVE9DT01QTEVURTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlTdHJpbmc6IHN0cmluZyA9IGVudGl0eVtrZXldIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdNZXRhZGF0YTogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzU3RyaW5nVmFsaWQoZW50aXR5U3RyaW5nLCBzdHJpbmdNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1RFWFRCT1g6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5VGV4dGJveDogc3RyaW5nID0gZW50aXR5W2tleV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRib3hNZXRhZGF0YTogVGV4dGJveFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgVGV4dGJveFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzVGV4dGJveFZhbGlkKGVudGl0eVRleHRib3gsIHRleHRib3hNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1BBU1NXT1JEOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eVBhc3N3b3JkOiBzdHJpbmcgPSBlbnRpdHlba2V5XSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc3dvcmRNZXRhZGF0YTogUGFzc3dvcmRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlybVBhc3N3b3JkOiBzdHJpbmcgPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKCdjb25maXJtUGFzc3dvcmQnLCBlbnRpdHksIGtleSkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzUGFzc3dvcmRWYWxpZChlbnRpdHlQYXNzd29yZCwgcGFzc3dvcmRNZXRhZGF0YSwgY29uZmlybVBhc3N3b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5OVU1CRVJfRFJPUERPV046XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk5VTUJFUjpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuTlVNQkVSX1NMSURFUjpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlOdW1iZXI6IG51bWJlciA9IGVudGl0eVtrZXldIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJNZXRhZGF0YTogRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzTnVtYmVyVmFsaWQoZW50aXR5TnVtYmVyLCBudW1iZXJNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eU9iamVjdDogRW50aXR5VHlwZSA9IGVudGl0eVtrZXldIGFzIEVudGl0eVR5cGU7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXJLZXkgaW4gZW50aXR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzUHJvcGVydHlWYWxpZChlbnRpdHlPYmplY3QsIHBhcmFtZXRlcktleSwgb21pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUU6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0U6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUFycmF5OiB1bmtub3duW10gPSBlbnRpdHlba2V5XSBhcyB1bmtub3duW107XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheU1ldGFkYXRhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+ID0gbWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlNZXRhZGF0YS5yZXF1aXJlZCAmJiAhZW50aXR5QXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKGVudGl0eVtrZXldIGFzIERhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVNZXRhZGF0YTogRGVmYXVsdERhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNEYXRlVmFsaWQoZW50aXR5RGF0ZSwgZGF0ZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eURhdGVSYW5nZTogRGF0ZVJhbmdlID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHlba2V5XSBhcyBEYXRlUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVSYW5nZU1ldGFkYXRhOiBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNEYXRlUmFuZ2VWYWxpZChlbnRpdHlEYXRlUmFuZ2UsIGRhdGVSYW5nZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1RJTUU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZShlbnRpdHlba2V5XSBhcyBEYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlVGltZU1ldGFkYXRhOiBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRGF0ZVRpbWVWYWxpZChlbnRpdHlEYXRlVGltZSwgZGF0ZVRpbWVNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUZpbGU6IEZpbGVEYXRhIHwgRmlsZURhdGFbXSA9IGVudGl0eVtrZXldIGFzIEZpbGVEYXRhIHwgRmlsZURhdGFbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlGaWxlTWV0YWRhdGE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRmlsZURhdGFWYWxpZChlbnRpdHlGaWxlLCBlbnRpdHlGaWxlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfTUFOWTpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBtYXgtbGVuXG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTWV0YWRhdGE6IEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGUsIGFueSwgYW55LCBhbnk+ID0gbWV0YWRhdGEgYXMgQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgYW55LCBhbnksIGFueT47XG4gICAgICAgICAgICAgICAgaWYgKCFjdXN0b21NZXRhZGF0YS5pc1ZhbGlkKGVudGl0eVtrZXldLCBvbWl0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgaW5wdXQgYmVjYXVzZSB0aGUgRGVjb3JhdG9yVHlwZSAke3R5cGV9IGlzIG5vdCBrbm93bmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzQm9vbGVhblZhbGlkKHZhbHVlOiBib29sZWFuLCBtZXRhZGF0YTogVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZXF1aXJlZCAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc1N0cmluZ1ZhbGlkKHZhbHVlOiBzdHJpbmcsIG1ldGFkYXRhOiBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtZXRhZGF0YS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZWdleCAmJiAhdmFsdWUubWF0Y2gobWV0YWRhdGEucmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNUZXh0Ym94VmFsaWQodmFsdWU6IHN0cmluZywgbWV0YWRhdGE6IFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEubWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1ldGFkYXRhLm1heExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWV0YWRhdGEubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNQYXNzd29yZFZhbGlkKHZhbHVlOiBzdHJpbmcsIG1ldGFkYXRhOiBQYXNzd29yZFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsLCBjb25maXJtUGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IGNvbmZpcm1QYXNzd29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWV0YWRhdGEubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtZXRhZGF0YS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEucmVnZXggJiYgIXZhbHVlLm1hdGNoKG1ldGFkYXRhLnJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzTnVtYmVyVmFsaWQodmFsdWU6IG51bWJlciwgbWV0YWRhdGE6IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEubWF4ICYmIHZhbHVlID4gbWV0YWRhdGEubWF4KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbiAmJiB2YWx1ZSA8IG1ldGFkYXRhLm1pbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRGF0ZVZhbGlkKHZhbHVlOiBEYXRlLCBtZXRhZGF0YTogRGVmYXVsdERhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEubWluICYmIHZhbHVlLmdldFRpbWUoKSA8IG1ldGFkYXRhLm1pbih2YWx1ZSkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heCAmJiB2YWx1ZS5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXgodmFsdWUpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5maWx0ZXIgJiYgIW1ldGFkYXRhLmZpbHRlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0RhdGVSYW5nZVZhbGlkKHZhbHVlOiBEYXRlUmFuZ2UsIG1ldGFkYXRhOiBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZS5zdGFydCBhcyBEYXRlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHZhbHVlLmVuZCBhcyBEYXRlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5zdGFydCA9IG5ldyBEYXRlKHZhbHVlLnN0YXJ0KTtcbiAgICAgICAgdmFsdWUuZW5kID0gbmV3IERhdGUodmFsdWUuZW5kKTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pblN0YXJ0ICYmIHZhbHVlLnN0YXJ0LmdldFRpbWUoKSA8IG1ldGFkYXRhLm1pblN0YXJ0KHZhbHVlLnN0YXJ0KS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4U3RhcnQgJiYgdmFsdWUuc3RhcnQuZ2V0VGltZSgpID4gbWV0YWRhdGEubWF4U3RhcnQodmFsdWUuc3RhcnQpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5FbmQgJiYgdmFsdWUuZW5kLmdldFRpbWUoKSA8IG1ldGFkYXRhLm1pbkVuZCh2YWx1ZS5lbmQpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhFbmQgJiYgdmFsdWUuZW5kLmdldFRpbWUoKSA+IG1ldGFkYXRhLm1heEVuZCh2YWx1ZS5lbmQpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5maWx0ZXIpIHtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmlsdGVyKHZhbHVlLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmlsdGVyKHZhbHVlLmVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkYXRlIG9mIHZhbHVlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlcihkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRGF0ZVRpbWVWYWxpZCh2YWx1ZTogRGF0ZSwgbWV0YWRhdGE6IERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5EYXRlICYmIHZhbHVlLmdldFRpbWUoKSA8IG1ldGFkYXRhLm1pbkRhdGUodmFsdWUpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhEYXRlICYmIHZhbHVlLmdldFRpbWUoKSA+IG1ldGFkYXRhLm1heERhdGUodmFsdWUpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5maWx0ZXJEYXRlICYmICFtZXRhZGF0YS5maWx0ZXJEYXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWU6IFRpbWUgPSB7XG4gICAgICAgICAgICBob3VyczogdmFsdWUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHZhbHVlLmdldE1pbnV0ZXMoKVxuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0YWRhdGEubWluVGltZSkge1xuICAgICAgICAgICAgY29uc3QgbWluVGltZTogVGltZSA9IG1ldGFkYXRhLm1pblRpbWUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIHRpbWUuaG91cnMgPiBtaW5UaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgIHx8IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuaG91cnMgPT09IG1pblRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUubWludXRlcyA+PSBtaW5UaW1lLm1pbnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4VGltZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4VGltZTogVGltZSA9IG1ldGFkYXRhLm1heFRpbWUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIHRpbWUuaG91cnMgPCBtYXhUaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgIHx8IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuaG91cnMgPT09IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUubWludXRlcyA8PSBtYXhUaW1lLm1pbnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyVGltZSkge1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5maWx0ZXJUaW1lKHRpbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRmlsZURhdGFWYWxpZCh2YWx1ZTogRmlsZURhdGEgfCBGaWxlRGF0YVtdLCBtZXRhZGF0YTogRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmaWxlczogRmlsZURhdGFbXSA9IG1ldGFkYXRhLm11bHRpcGxlID8gdmFsdWUgYXMgRmlsZURhdGFbXSA6IFt2YWx1ZSBhcyBGaWxlRGF0YV07XG4gICAgICAgIGxldCBmaWxlU2l6ZVRvdGFsOiBudW1iZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghZmlsZS5uYW1lIHx8ICFmaWxlLmZpbGUgJiYgIWZpbGUudXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFGaWxlVXRpbGl0aWVzLmlzTWltZVR5cGVWYWxpZChmaWxlLnR5cGUsIG1ldGFkYXRhLmFsbG93ZWRNaW1lVHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZmlsZS5zaXplLCAnQicpID4gbWV0YWRhdGEubWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVTaXplVG90YWwgKz0gZmlsZS5zaXplO1xuICAgICAgICAgICAgaWYgKEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZmlsZVNpemVUb3RhbCwgJ0InKSA+IG1ldGFkYXRhLm1heFNpemVUb3RhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gZW50aXR5IGlzIFwiZGlydHlcIiAoaWYgaXRzIHZhbHVlcyBoYXZlIGNoYW5nZWQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYWZ0ZXIgYWxsIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgZGlydHkuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGlzRGlydHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCEoZW50aXR5UHJpb3JDaGFuZ2VzIGFzIEVudGl0eVR5cGUgfCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gYXdhaXQgRW50aXR5VXRpbGl0aWVzLmRpZmZlcmVuY2VzRm9yRGlydHkoZW50aXR5LCBlbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VzLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGRpZmZlcmVuY2VzRm9yRGlydHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXT4ge1xuICAgICAgICBjb25zdCByZXM6IERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0VXRpbGl0aWVzLm93bktleXMoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSkpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGVudGl0eVtrZXldXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzZXQgYmxvYiBmaWxlIGRhdGEgc28gdGhhdCBpdCBpcyBvbmx5IHJlcXVlc3RlZCBvbmNlLlxuICAgICAgICAgICAgICAgIGVudGl0eVByaW9yQ2hhbmdlc1trZXldID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHlba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gRW50aXRpZXMgYW5kIHJldHVybnMgdGhlaXIgZGlmZmVyZW5jZSBpbiBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGZpcnN0IGVudGl0eSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgc2Vjb25kIGVudGl0eSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBFbnRpdGllcyBpbiBmb3JtIG9mIGEgUGFydGlhbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZGlmZmVyZW5jZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZVxuICAgICk6IFByb21pc2U8UGFydGlhbDxFbnRpdHlUeXBlPj4ge1xuICAgICAgICBjb25zdCByZXM6IFBhcnRpYWw8RW50aXR5VHlwZT4gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlKSkpIHtcbiAgICAgICAgICAgICAgICByZXNba2V5XSA9IGVudGl0eVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqIEl0IHVzZXMgdGhlIGlzRXF1YWwgbWV0aG9kIGZyb20gTG9kYXNoVXRpbGl0aWVzIGFuZCBleHRlbmRzIGl0IHdpdGggZnVuY3Rpb25hbGl0eSByZWdhcmRpbmcgRGF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVQcmlvckNoYW5nZXMgLSBUaGUgdmFsdWUgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGlzRXF1YWwoXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bixcbiAgICAgICAgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsXG4gICAgICAgIHR5cGU6IERlY29yYXRvclR5cGVzXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5maWx0ZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGVUaW1lKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEU6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheURhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheURhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCkuZmlsdGVyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbEFycmF5U3RyaW5nKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfSU1BR0U6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxGaWxlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgKG1ldGFkYXRhIGFzIERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLm11bHRpcGxlKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQ3VzdG9tKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgbWV0YWRhdGEgYXMgQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55LCBhbnksIGFueSwgYW55Pik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbCh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5U3RyaW5nKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4gfCBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0FycmF5OiBzdHJpbmdbXSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgc3RyaW5nW10pLnNvcnQoKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXM6IHN0cmluZ1tdID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBzdHJpbmdbXSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoc3RyaW5nQXJyYXksIHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZTogRGF0ZVtdID0gKHZhbHVlIGFzIERhdGVbXSkubWFwKHYgPT4gbmV3IERhdGUodikpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVQcmlvckNoYW5nZXM6IERhdGVbXSA9ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlW10pLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChuZXdWYWx1ZSwgbmV3VmFsdWVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheURhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VzOiBEYXRlUmFuZ2VbXSA9ICh2YWx1ZSBhcyBEYXRlUmFuZ2VbXSkuc29ydCgpO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2VbXSA9ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2VbXSkuc29ydCgpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlcy5sZW5ndGggIT09IGRhdGVSYW5nZXNQcmlvckNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlUmFuZ2UoZGF0ZVJhbmdlc1tpXSwgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlc1tpXSwgZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsRGF0ZVRpbWUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICBkYXRlUHJpb3JDaGFuZ2VzLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2U6IERhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0ID0gbmV3IERhdGUoKHZhbHVlIGFzIERhdGVSYW5nZSkuc3RhcnQpO1xuICAgICAgICBkYXRlUmFuZ2UuZW5kID0gbmV3IERhdGUoKHZhbHVlIGFzIERhdGVSYW5nZSkuZW5kKTtcbiAgICAgICAgZGF0ZVJhbmdlLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCxcbiAgICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VQcmlvckNoYW5nZXM6IERhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0ID0gbmV3IERhdGUoKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVSYW5nZSkuc3RhcnQpO1xuICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kID0gbmV3IERhdGUoKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVSYW5nZSkuZW5kKTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0LFxuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCxcbiAgICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZVJhbmdlLCBkYXRlUmFuZ2VQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaXNFcXVhbEZpbGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBtdWx0aXBsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlUHJpb3JDaGFuZ2VzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZSBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBjb25zdCBmaWxlc1ByaW9yQ2hhbmdlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoICE9PSBmaWxlc1ByaW9yQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyB0aGlzIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIGFueSBmaWxlcyBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgIGlmICghTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoTG9kYXNoVXRpbGl0aWVzLm9taXQoZmlsZXNbaV0sICdmaWxlJyksIExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzUHJpb3JDaGFuZ2VzW2ldLCAnZmlsZScpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlICYmICFmaWxlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzW2ldKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmZpbGUgJiYgIWZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGUpIHtcbiAgICAgICAgICAgICAgICBmaWxlc1ByaW9yQ2hhbmdlc1tpXSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZXNQcmlvckNoYW5nZXNbaV0pO1xuICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzID0gZmlsZXNQcmlvckNoYW5nZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGF3YWl0IGZpbGVzW2ldLmZpbGU/LnRleHQoKSwgYXdhaXQgZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZT8udGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQ3VzdG9tKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIG1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbWV0YWRhdGEuaXNFcXVhbCh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIG1ldGFkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgZW50aXR5IGtleXMgYnkgdGhlaXIgb3JkZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQga2V5IG9mIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQ3VycmVudCBlbnRpdHkgKHVzZWQgdG8gZ2V0IG1ldGFkYXRhIG9mIGVudGl0eSBrZXlzKS5cbiAgICAgKiBAcmV0dXJucyAwIGlmIGJvdGggdmFsdWVzIGhhdmUgdGhlIHNhbWUgb3JkZXIsIGEgbmVnYXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlZm9yZSAnYicsIGEgcG9zaXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlaGluZCAnYicuXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmVPcmRlcjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBhOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBiOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGVcbiAgICApOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtZXRhZGF0YUE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGEpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YUI6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGIpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgLSBtZXRhZGF0YUIucG9zaXRpb24ub3JkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgZm9yIFwibGdcIiwgXCJtZFwiLCBcInNtXCIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGdldCB0aGUgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgb2YgdGhlIGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IC0gS2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIERlZmluZXMgZm9yIHdoaWNoIHNjcmVlbiBzaXplIHRoZSBjb2x1bW4gdmFsdWVzIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBCb290c3RyYXAgY29sdW1uIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaWR0aDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGtleToga2V5b2YgRW50aXR5VHlwZSwgdHlwZTogJ2xnJyB8ICdtZCcgfCAnc20nXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbGcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzBdO1xuICAgICAgICAgICAgY2FzZSAnbWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzFdO1xuICAgICAgICAgICAgY2FzZSAnc20nOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIGFsbCBjaGFuZ2VzIG9uIGFuIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHJlc2V0LlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzZXRDaGFuZ2VzT25FbnRpdHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KGVudGl0eSwga2V5LCBSZWZsZWN0VXRpbGl0aWVzLmdldChlbnRpdHlQcmlvckNoYW5nZXMsIGtleSkpO1xuICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIChSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKHRoaXMuTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVksIGVudGl0eSwga2V5KSBhcyBzdHJpbmdbXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEoaywgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKGssIHVuZGVmaW5lZCwgZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHRhYjogbnVtYmVyLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbixcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuXG4gICAgKTogRW50aXR5Um93PEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gW107XG5cbiAgICAgICAgY29uc3Qga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdCk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUm93czogbnVtYmVyID0gRW50aXR5VXRpbGl0aWVzLmdldE51bWJlck9mUm93czxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIHRhYik7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogaSxcbiAgICAgICAgICAgICAgICBrZXlzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIGksIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYikubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0Um93OiBFbnRpdHlSb3c8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgcm93OiBudW1iZXJPZlJvd3MgKyAxLFxuICAgICAgICAgICAgICAgIGtleXM6IEVudGl0eVV0aWxpdGllcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChsYXN0Um93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFicyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgcm93cyBmcm9tLlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckNyZWF0ZSAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvckNyZWF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckVkaXQgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JVcGRhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc29ydGVkIFRhYnMgY29udGFpbmluZyB0aGUgcm93cyBhbmQgdGhlIGtleXMgdG8gZGlzcGxheSBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW50aXR5VGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogRW50aXR5VGFiPEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHksIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlRhYnM6IG51bWJlciA9IEVudGl0eVV0aWxpdGllcy5nZXROdW1iZXJPZlRhYnM8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5KTtcblxuICAgICAgICBpZiAoRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oZW50aXR5LCAtMSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHRhYk5hbWU6IEVudGl0eVV0aWxpdGllcy5nZXRGaXJzdFRhYk5hbWUoZW50aXR5KSxcbiAgICAgICAgICAgICAgICB0YWI6IC0xLFxuICAgICAgICAgICAgICAgIHJvd3M6IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KGVudGl0eSwgLTEsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2goZmlyc3RUYWIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMjsgaSA8PSBudW1iZXJPZlRhYnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogRW50aXR5VXRpbGl0aWVzLmdldFRhYk5hbWUoZW50aXR5LCBpKSxcbiAgICAgICAgICAgICAgICB0YWI6IGksXG4gICAgICAgICAgICAgICAgcm93czogRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oZW50aXR5LCBpLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKHRhYik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEtleXNGb3JSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcm93OiBudW1iZXIsXG4gICAgICAgIHRhYjogbnVtYmVyXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICByZXR1cm4ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24ucm93ID09PSByb3cpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBFbnRpdHlVdGlsaXRpZXMuY29tcGFyZU9yZGVyKGEsIGIsIGVudGl0eSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mUm93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBrZXlzXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnJvdylcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAtMSA6IDEpKVswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXROdW1iZXJPZlRhYnM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSwgZW50aXR5OiBFbnRpdHlUeXBlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnRhYilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAtMSA6IDEpKVswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUYWJOYW1lPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlLCB0YWI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVkVGFiTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSlcbiAgICAgICAgICAgIC5maW5kKG0gPT4gbS5wb3NpdGlvbi50YWIgPT09IHRhYiAmJiBtLnBvc2l0aW9uLnRhYk5hbWUpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/IGBUYWIgJHt0YWJ9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGaXJzdFRhYk5hbWU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KVxuICAgICAgICAgICAgLm1hcChrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0ucG9zaXRpb24udGFiTmFtZSAmJiBtLnBvc2l0aW9uLnRhYiA9PT0gLTEpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/ICdUYWIgMSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUga2V5cyBvZi5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Yga2V5cyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlzT2Y8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgbGV0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSk7XG4gICAgICAgIGlmIChoaWRlT21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgY29uc3Qgb21pdEZvckNyZWF0ZUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yQ3JlYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhpZGVPbWl0Rm9yRWRpdCkge1xuICAgICAgICAgICAgY29uc3Qgb21pdEZvclVwZGF0ZUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yVXBkYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgcm93IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVJvdzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGluIHdoaWNoIHRoaXMgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICByb3c6IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBUaGUga2V5cyBvZiB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXVxufVxuXG4vKipcbiAqIEEgdGFiIHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZGlzcGxheSBhbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5VGFiPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0YWIgaW4gd2hpY2ggdGhlIHJvd3Mgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICB0YWI6IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSB0byBkaXNwbGF5IGluc2lkZSB0aGUgdGFiLlxuICAgICAqL1xuICAgIHRhYk5hbWU6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgcm93cyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoaXMgdGFiLC5cbiAgICAgKi9cbiAgICByb3dzOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXVxufSJdfQ==
@@ -1,7 +1,9 @@
1
1
  /* eslint-disable jsdoc/require-jsdoc */
2
2
  import { Component } from '@angular/core';
3
3
  import { DateUtilities } from '../../../../classes/date.utilities';
4
+ import { EntityUtilities } from '../../../../classes/entity.utilities';
4
5
  import { LodashUtilities } from '../../../../encapsulation/lodash.utilities';
6
+ import { ReflectUtilities } from '../../../../encapsulation/reflect.utilities';
5
7
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
6
8
  import * as i0 from "@angular/core";
7
9
  import * as i1 from "@angular/common";
@@ -18,6 +20,24 @@ export class DateRangeInputComponent extends NgxMatEntityBaseInputComponent {
18
20
  super(...arguments);
19
21
  this.defaultDateFilter = DateUtilities.defaultDateFilter;
20
22
  }
23
+ get dateRange() {
24
+ return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_KEY, this.entity, this.key);
25
+ }
26
+ set dateRange(value) {
27
+ ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_KEY, value, this.entity, this.key);
28
+ }
29
+ get dateRangeStart() {
30
+ return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_START_KEY, this.entity, this.key);
31
+ }
32
+ set dateRangeStart(value) {
33
+ ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_START_KEY, value, this.entity, this.key);
34
+ }
35
+ get dateRangeEnd() {
36
+ return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_END_KEY, this.entity, this.key);
37
+ }
38
+ set dateRangeEnd(value) {
39
+ ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_END_KEY, value, this.entity, this.key);
40
+ }
21
41
  ngOnInit() {
22
42
  super.ngOnInit();
23
43
  this.dateRange = LodashUtilities.cloneDeep(this.propertyValue) ?? EMPTY_DATERANGE;
@@ -48,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
48
68
  type: Component,
49
69
  args: [{ selector: 'date-range-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n \n <mat-date-range-input [rangePicker]=\"picker\" [required]=\"metadata.required\" [dateFilter]=\"metadata.filter ?? defaultDateFilter\" [disabled]=\"isReadOnly\">\n <input matStartDate\n [(ngModel)]=\"dateRangeStart\"\n [name]=\"key.toString() + 'start'\"\n #startModel=\"ngModel\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minStart ? metadata.minStart(dateRange.start) : undefined\"\n [max]=\"metadata.maxStart ? metadata.maxStart(dateRange.start) : undefined\"\n [placeholder]=\"metadata.placeholderStart\"\n (ngModelChange)=\"setDateRangeValues()\"\n >\n <input matEndDate\n [(ngModel)]=\"dateRangeEnd\"\n [name]=\"key.toString() + 'end'\"\n #endModel=\"ngModel\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minEnd ? metadata.minEnd(dateRange.end) : undefined\"\n [max]=\"metadata.maxEnd ? metadata.maxEnd(dateRange.end) : undefined\"\n [placeholder]=\"metadata.placeholderEnd\"\n (ngModelChange)=\"setDateRangeValues()\"\n >\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <mat-error *ngIf=\"startModel.errors\">{{getValidationErrorMessage(startModel)}}</mat-error>\n <mat-error *ngIf=\"!startModel.errors && endModel.errors\">{{getValidationErrorMessage(endModel)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"] }]
50
70
  }] });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2RhdGUvZGF0ZS1yYW5nZS1pbnB1dC9kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS9kYXRlLXJhbmdlLWlucHV0L2RhdGUtcmFuZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBRTVFLE1BQU0sZUFBZSxHQUFjO0lBQy9CLEtBQUssRUFBRSxTQUE0QjtJQUNuQyxHQUFHLEVBQUUsU0FBNEI7SUFDakMsTUFBTSxFQUFFLFNBQVM7Q0FDcEIsQ0FBQztBQVFGLE1BQU0sT0FBTyx1QkFDVCxTQUFRLDhCQUFnRjtJQVA1Rjs7UUFhSSxzQkFBaUIsR0FBMEMsYUFBYSxDQUFDLGlCQUFpQixDQUFDO0tBOEI5RjtJQTVCWSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksZUFBZSxDQUFDO1FBQ2xGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxNQUFNLE1BQU0sR0FBVyxhQUFhLENBQUMsZUFBZSxDQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQzlEO2FBQ0k7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7O29IQXBDUSx1QkFBdUI7d0dBQXZCLHVCQUF1QiwrRUN0QnBDLHdtREE4QmlCOzJGRFJKLHVCQUF1QjtrQkFObkMsU0FBUzsrQkFFSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZuIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBEYXRlVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY2xhc3Nlcy9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlCYXNlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9iYXNlLWlucHV0LmNvbXBvbmVudCc7XG5cbmNvbnN0IEVNUFRZX0RBVEVSQU5HRTogRGF0ZVJhbmdlID0ge1xuICAgIHN0YXJ0OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBEYXRlLFxuICAgIGVuZDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgRGF0ZSxcbiAgICB2YWx1ZXM6IHVuZGVmaW5lZFxufTtcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2RhdGUtcmFuZ2UtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlSW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PlxuICAgIGV4dGVuZHMgTmd4TWF0RW50aXR5QmFzZUlucHV0Q29tcG9uZW50PEVudGl0eVR5cGUsIERlY29yYXRvclR5cGVzLkRBVEVfUkFOR0UsIERhdGVSYW5nZT4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgZGF0ZVJhbmdlITogRGF0ZVJhbmdlO1xuICAgIGRhdGVSYW5nZVN0YXJ0PzogRGF0ZTtcbiAgICBkYXRlUmFuZ2VFbmQ/OiBEYXRlO1xuXG4gICAgZGVmYXVsdERhdGVGaWx0ZXI6IERhdGVGaWx0ZXJGbjxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBEYXRlVXRpbGl0aWVzLmRlZmF1bHREYXRlRmlsdGVyO1xuXG4gICAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnByb3BlcnR5VmFsdWUpID8/IEVNUFRZX0RBVEVSQU5HRTtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VTdGFydCA9IG5ldyBEYXRlKHRoaXMuZGF0ZVJhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VFbmQgPSBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZS5lbmQpO1xuICAgICAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGRhdGUgcmFuZ2UgdmFsdWVzIGJhc2VkIG9uIHRoZSBzdGFydCBhbmQgZW5kIGRhdGUuXG4gICAgICovXG4gICAgc2V0RGF0ZVJhbmdlVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRlUmFuZ2VTdGFydCAmJiB0aGlzLmRhdGVSYW5nZUVuZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2Uuc3RhcnQgPSBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLmVuZCA9IG5ldyBEYXRlKHRoaXMuZGF0ZVJhbmdlRW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlczogRGF0ZVtdID0gRGF0ZVV0aWxpdGllcy5nZXREYXRlc0JldHdlZW4oXG4gICAgICAgICAgICAgICAgbmV3IERhdGUodGhpcy5kYXRlUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZGF0ZVJhbmdlLmVuZCksXG4gICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YS5maWx0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZS52YWx1ZXMgPSB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2UudmFsdWVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHRoaXMuZGF0ZVJhbmdlO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG59IiwiPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgXG4gICAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIiBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWRcIiBbZGF0ZUZpbHRlcl09XCJtZXRhZGF0YS5maWx0ZXIgPz8gZGVmYXVsdERhdGVGaWx0ZXJcIiBbZGlzYWJsZWRdPVwiaXNSZWFkT25seVwiPlxuICAgICAgICA8aW5wdXQgbWF0U3RhcnREYXRlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGVSYW5nZVN0YXJ0XCJcbiAgICAgICAgICAgIFtuYW1lXT1cImtleS50b1N0cmluZygpICsgJ3N0YXJ0J1wiXG4gICAgICAgICAgICAjc3RhcnRNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCJcbiAgICAgICAgICAgIFttaW5dPVwibWV0YWRhdGEubWluU3RhcnQgPyBtZXRhZGF0YS5taW5TdGFydChkYXRlUmFuZ2Uuc3RhcnQpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFttYXhdPVwibWV0YWRhdGEubWF4U3RhcnQgPyBtZXRhZGF0YS5tYXhTdGFydChkYXRlUmFuZ2Uuc3RhcnQpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtZXRhZGF0YS5wbGFjZWhvbGRlclN0YXJ0XCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldERhdGVSYW5nZVZhbHVlcygpXCJcbiAgICAgICAgPlxuICAgICAgICA8aW5wdXQgbWF0RW5kRGF0ZVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlUmFuZ2VFbmRcIlxuICAgICAgICAgICAgW25hbWVdPVwia2V5LnRvU3RyaW5nKCkgKyAnZW5kJ1wiXG4gICAgICAgICAgICAjZW5kTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZFwiXG4gICAgICAgICAgICBbbWluXT1cIm1ldGFkYXRhLm1pbkVuZCA/IG1ldGFkYXRhLm1pbkVuZChkYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbbWF4XT1cIm1ldGFkYXRhLm1heEVuZCA/IG1ldGFkYXRhLm1heEVuZChkYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWV0YWRhdGEucGxhY2Vob2xkZXJFbmRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RGF0ZVJhbmdlVmFsdWVzKClcIlxuICAgICAgICA+XG4gICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgIDxtYXQtZGF0ZS1yYW5nZS1waWNrZXIgI3BpY2tlcj48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cblxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzdGFydE1vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShzdGFydE1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cIiFzdGFydE1vZGVsLmVycm9ycyAmJiBlbmRNb2RlbC5lcnJvcnNcIj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoZW5kTW9kZWwpfX08L21hdC1lcnJvcj5cbjwvbWF0LWZvcm0tZmllbGQ+Il19
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2RhdGUvZGF0ZS1yYW5nZS1pbnB1dC9kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS9kYXRlLXJhbmdlLWlucHV0L2RhdGUtcmFuZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUd2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7OztBQUU1RSxNQUFNLGVBQWUsR0FBYztJQUMvQixLQUFLLEVBQUUsU0FBNEI7SUFDbkMsR0FBRyxFQUFFLFNBQTRCO0lBQ2pDLE1BQU0sRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFRRixNQUFNLE9BQU8sdUJBQ1QsU0FBUSw4QkFBZ0Y7SUFQNUY7O1FBOEJJLHNCQUFpQixHQUEwQyxhQUFhLENBQUMsaUJBQWlCLENBQUM7S0E4QjlGO0lBbkRHLElBQUksU0FBUztRQUNULE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0s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YWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZuIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBEYXRlVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vY2xhc3Nlcy9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5QmFzZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1pbnB1dC5jb21wb25lbnQnO1xuXG5jb25zdCBFTVBUWV9EQVRFUkFOR0U6IERhdGVSYW5nZSA9IHtcbiAgICBzdGFydDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgRGF0ZSxcbiAgICBlbmQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIERhdGUsXG4gICAgdmFsdWVzOiB1bmRlZmluZWRcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdkYXRlLXJhbmdlLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZUlucHV0Q29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj5cbiAgICBleHRlbmRzIE5neE1hdEVudGl0eUJhc2VJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlLCBEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFLCBEYXRlUmFuZ2U+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGdldCBkYXRlUmFuZ2UoKTogRGF0ZVJhbmdlIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoRW50aXR5VXRpbGl0aWVzLkRBVEVfUkFOR0VfS0VZLCB0aGlzLmVudGl0eSwgdGhpcy5rZXkpIGFzIERhdGVSYW5nZTtcbiAgICB9XG4gICAgc2V0IGRhdGVSYW5nZSh2YWx1ZTogRGF0ZVJhbmdlKSB7XG4gICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoRW50aXR5VXRpbGl0aWVzLkRBVEVfUkFOR0VfS0VZLCB2YWx1ZSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZVJhbmdlU3RhcnQoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKEVudGl0eVV0aWxpdGllcy5EQVRFX1JBTkdFX1NUQVJUX0tFWSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KSBhcyBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzZXQgZGF0ZVJhbmdlU3RhcnQodmFsdWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuREFURV9SQU5HRV9TVEFSVF9LRVksIHZhbHVlLCB0aGlzLmVudGl0eSwgdGhpcy5rZXkpO1xuICAgIH1cblxuICAgIGdldCBkYXRlUmFuZ2VFbmQoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKEVudGl0eVV0aWxpdGllcy5EQVRFX1JBTkdFX0VORF9LRVksIHRoaXMuZW50aXR5LCB0aGlzLmtleSkgYXMgRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IGRhdGVSYW5nZUVuZCh2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKEVudGl0eVV0aWxpdGllcy5EQVRFX1JBTkdFX0VORF9LRVksIHZhbHVlLCB0aGlzLmVudGl0eSwgdGhpcy5rZXkpO1xuICAgIH1cblxuICAgIGRlZmF1bHREYXRlRmlsdGVyOiBEYXRlRmlsdGVyRm48RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+ID0gRGF0ZVV0aWxpdGllcy5kZWZhdWx0RGF0ZUZpbHRlcjtcblxuICAgIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5wcm9wZXJ0eVZhbHVlKSA/PyBFTVBUWV9EQVRFUkFOR0U7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlU3RhcnQgPSBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZS5zdGFydCk7XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRW5kID0gbmV3IERhdGUodGhpcy5kYXRlUmFuZ2UuZW5kKTtcbiAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBkYXRlIHJhbmdlIHZhbHVlcyBiYXNlZCBvbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqL1xuICAgIHNldERhdGVSYW5nZVZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlU3RhcnQgJiYgdGhpcy5kYXRlUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnN0YXJ0ID0gbmV3IERhdGUodGhpcy5kYXRlUmFuZ2VTdGFydCk7XG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5lbmQgPSBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZUVuZCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXM6IERhdGVbXSA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZGF0ZVJhbmdlLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZS5lbmQpLFxuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEuZmlsdGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2UudmFsdWVzID0gdmFsdWVzLmxlbmd0aCA/IHZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB0aGlzLmRhdGVSYW5nZTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxufSIsIjxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgIFxuICAgIDxtYXQtZGF0ZS1yYW5nZS1pbnB1dCBbcmFuZ2VQaWNrZXJdPVwicGlja2VyXCIgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkXCIgW2RhdGVGaWx0ZXJdPVwibWV0YWRhdGEuZmlsdGVyID8/IGRlZmF1bHREYXRlRmlsdGVyXCIgW2Rpc2FibGVkXT1cImlzUmVhZE9ubHlcIj5cbiAgICAgICAgPGlucHV0IG1hdFN0YXJ0RGF0ZVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlUmFuZ2VTdGFydFwiXG4gICAgICAgICAgICBbbmFtZV09XCJrZXkudG9TdHJpbmcoKSArICdzdGFydCdcIlxuICAgICAgICAgICAgI3N0YXJ0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZFwiXG4gICAgICAgICAgICBbbWluXT1cIm1ldGFkYXRhLm1pblN0YXJ0ID8gbWV0YWRhdGEubWluU3RhcnQoZGF0ZVJhbmdlLnN0YXJ0KSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbbWF4XT1cIm1ldGFkYXRhLm1heFN0YXJ0ID8gbWV0YWRhdGEubWF4U3RhcnQoZGF0ZVJhbmdlLnN0YXJ0KSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWV0YWRhdGEucGxhY2Vob2xkZXJTdGFydFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXREYXRlUmFuZ2VWYWx1ZXMoKVwiXG4gICAgICAgID5cbiAgICAgICAgPGlucHV0IG1hdEVuZERhdGVcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0ZVJhbmdlRW5kXCJcbiAgICAgICAgICAgIFtuYW1lXT1cImtleS50b1N0cmluZygpICsgJ2VuZCdcIlxuICAgICAgICAgICAgI2VuZE1vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWRcIlxuICAgICAgICAgICAgW21pbl09XCJtZXRhZGF0YS5taW5FbmQgPyBtZXRhZGF0YS5taW5FbmQoZGF0ZVJhbmdlLmVuZCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW21heF09XCJtZXRhZGF0YS5tYXhFbmQgPyBtZXRhZGF0YS5tYXhFbmQoZGF0ZVJhbmdlLmVuZCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhLnBsYWNlaG9sZGVyRW5kXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldERhdGVSYW5nZVZhbHVlcygpXCJcbiAgICAgICAgPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZS1yYW5nZS1waWNrZXI+XG5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwic3RhcnRNb2RlbC5lcnJvcnNcIj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2Uoc3RhcnRNb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhc3RhcnRNb2RlbC5lcnJvcnMgJiYgZW5kTW9kZWwuZXJyb3JzXCI+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGVuZE1vZGVsKX19PC9tYXQtZXJyb3I+XG48L21hdC1mb3JtLWZpZWxkPiJdfQ==