@decaf-ts/for-angular 0.0.23 → 0.0.25

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 (36) hide show
  1. package/components/component-renderer/component-renderer.component.d.ts +3 -2
  2. package/components/crud-field/crud-field.component.d.ts +4 -2
  3. package/components/fieldset/fieldset.component.d.ts +10 -1
  4. package/components/for-angular-components.module.d.ts +3 -2
  5. package/components/index.d.ts +1 -0
  6. package/components/layout/layout.component.d.ts +1 -24
  7. package/components/model-renderer/model-renderer.component.d.ts +6 -1
  8. package/components/stepped-form/stepped-form.component.d.ts +255 -0
  9. package/engine/NgxBaseComponent.d.ts +2 -2
  10. package/engine/NgxCrudFormField.d.ts +1 -0
  11. package/engine/NgxFormService.d.ts +381 -48
  12. package/engine/NgxRenderingEngine.d.ts +4 -2
  13. package/engine/interfaces.d.ts +1 -1
  14. package/engine/types.d.ts +4 -3
  15. package/esm2022/components/component-renderer/component-renderer.component.mjs +10 -4
  16. package/esm2022/components/crud-field/crud-field.component.mjs +14 -3
  17. package/esm2022/components/crud-form/crud-form.component.mjs +3 -3
  18. package/esm2022/components/empty-state/empty-state.component.mjs +2 -2
  19. package/esm2022/components/fieldset/fieldset.component.mjs +5 -3
  20. package/esm2022/components/for-angular-components.module.mjs +12 -7
  21. package/esm2022/components/index.mjs +2 -1
  22. package/esm2022/components/layout/layout.component.mjs +4 -29
  23. package/esm2022/components/list/list.component.mjs +3 -3
  24. package/esm2022/components/model-renderer/model-renderer.component.mjs +10 -3
  25. package/esm2022/components/stepped-form/stepped-form.component.mjs +306 -0
  26. package/esm2022/engine/NgxBaseComponent.mjs +10 -4
  27. package/esm2022/engine/NgxCrudFormField.mjs +19 -17
  28. package/esm2022/engine/NgxFormService.mjs +438 -57
  29. package/esm2022/engine/NgxRenderingEngine.mjs +21 -10
  30. package/esm2022/engine/ValidatorFactory.mjs +4 -4
  31. package/esm2022/engine/interfaces.mjs +1 -1
  32. package/esm2022/engine/types.mjs +1 -1
  33. package/esm2022/i18n/data/en.json +5 -0
  34. package/fesm2022/decaf-ts-for-angular.mjs +837 -137
  35. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  36. package/package.json +1 -1
@@ -621,7 +621,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
621
621
  return this.mapper;
622
622
  }
623
623
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldsetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
624
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
624
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", page: "page", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content select=\"[slot=content]\"></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
625
625
  };
626
626
  FieldsetComponent = __decorate([
627
627
  Dynamic(),
@@ -643,7 +643,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
643
643
  IonReorderGroup,
644
644
  IonButton,
645
645
  IonIcon,
646
- ], host: { '[attr.id]': 'overriode ' }, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"] }]
646
+ ], host: { '[attr.id]': 'overriode ' }, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content select=\"[slot=content]\"></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"] }]
647
647
  }], ctorParameters: () => [], propDecorators: { accordionComponent: [{
648
648
  type: ViewChild,
649
649
  args: ['accordionComponent', { static: false }]
@@ -651,6 +651,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
651
651
  type: Input
652
652
  }], childOf: [{
653
653
  type: Input
654
+ }], page: [{
655
+ type: Input
654
656
  }], uid: [{
655
657
  type: Input
656
658
  }], customTypes: [{
@@ -672,4 +674,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
672
674
  }], handlers: [{
673
675
  type: Input
674
676
  }] } });
675
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxTCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUtwQzs7Ozs7Ozs7Ozs7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S0FBSztzQkFESixLQUFLO2dCQWFOLFFBQVE7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEhhbmRsZXJMaWtlLCBIVE1MRm9ybVRhcmdldCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJb25BY2NvcmRpb24sIElvbkFjY29yZGlvbkdyb3VwLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsLCBJb25MaXN0LCBJdGVtUmVvcmRlckV2ZW50RGV0YWlsLCBJb25SZW9yZGVyR3JvdXAsIElvblJlb3JkZXIsIElvbkljb24sIElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZW5lcmF0ZVJhbmRvbVZhbHVlLCBpdGVtTWFwcGVyLCB3aW5kb3dFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUZpZWxkU2V0SXRlbSwgSUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIER5bmFtaWMgZmllbGRzZXQgY29tcG9uZW50IHdpdGggY29sbGFwc2libGUgYWNjb3JkaW9uIGZ1bmN0aW9uYWxpdHkuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHNvcGhpc3RpY2F0ZWQgZmllbGRzZXQgY29udGFpbmVyIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHRzIGl0cyBiZWhhdmlvciBiYXNlZCBvbiBDUlVEIG9wZXJhdGlvbnMuIEl0IGludGVncmF0ZXMgc2VhbWxlc3NseSB3aXRoIElvbmljJ3NcbiAqIGFjY29yZGlvbiBjb21wb25lbnRzIHRvIGNyZWF0ZSBleHBhbmRhYmxlL2NvbGxhcHNpYmxlIHNlY3Rpb25zIGZvciBvcmdhbml6aW5nIGZvcm1cbiAqIGNvbnRlbnQgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24uIFRoZSBjb21wb25lbnQgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmVzIGl0cyBpbml0aWFsXG4gKiBzdGF0ZSBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUsIG9wZW5pbmcgYXV0b21hdGljYWxseSBmb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnNcbiAqIHdoaWxlIHJlbWFpbmluZyBjbG9zZWQgZm9yIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgc3RhdGUgbWFuYWdlbWVudCAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIlBlcnNvbmFsIEluZm9ybWF0aW9uXCJcbiAqICAgW29wZXJhdGlvbl09XCJPcGVyYXRpb25LZXlzLlJFQURcIlxuICogICB0YXJnZXQ9XCJfc2VsZlwiPlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiTmFtZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbmFtZVwiPjwvaW9uLWlucHV0PlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiRW1haWxcIiB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGVtYWlsXCI+PC9pb24taW5wdXQ+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqXG4gKiA8IS0tIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIG9wZXJhdGlvbiAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIkNvbnRhY3QgRGV0YWlsc1wiXG4gKiAgIFtvcGVyYXRpb25dPVwiY3VycmVudE9wZXJhdGlvblwiXG4gKiAgIHRhcmdldD1cIl9ibGFua1wiPlxuICogICA8IS0tIENvbXBsZXggZm9ybSBmaWVsZHMgLS0+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgSSBhcyBJb25pYyBBY2NvcmRpb25cbiAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAqXG4gKiAgIEYtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICogICBhbHQgb3BlcmF0aW9uIGlzIFJFQUQgb3IgREVMRVRFXG4gKiAgICAgRi0+PkY6IFNldCBpc09wZW4gPSB0cnVlXG4gKiAgICAgRi0+PkQ6IFF1ZXJ5IGFjY29yZGlvbiBlbGVtZW50XG4gKiAgICAgRi0+Pkk6IFNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gJ29wZW4nXG4gKiAgICAgRi0+PkY6IFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICogICBlbmRcbiAqICAgVS0+Pkk6IENsaWNrIGFjY29yZGlvbiBoZWFkZXJcbiAqICAgSS0+PkY6IGhhbmRsZUNoYW5nZShldmVudClcbiAqICAgRi0+PkY6IFVwZGF0ZSBpc09wZW4gc3RhdGVcbiAqICAgRi0+Pkk6IFJlZmxlY3QgbmV3IHN0YXRlXG4gKlxuICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkFjY29yZGlvbkdyb3VwLFxuICAgIElvbkFjY29yZGlvbixcbiAgICBJb25MaXN0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25SZW9yZGVyLFxuICAgIElvblJlb3JkZXJHcm91cCxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uSWNvbixcbiAgXSxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAnb3ZlcnJpb2RlICd9LFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZHNldENvbXBvbmVudCBleHRlbmRzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgaW9uLWFjY29yZGlvbi1ncm91cCBjb21wb25lbnQgZm9yIHByb2dyYW1tYXRpYyBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgSW9uaWMgYWNjb3JkaW9uIGdyb3VwIGNvbXBvbmVudC5cbiAgICogVGhpcyBlbmFibGVzIHByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgdGhlIGFjY29yZGlvbidzIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSwgYWxsb3dpbmdcbiAgICogdGhlIGNvbXBvbmVudCB0byBvcGVuL2Nsb3NlIHRoZSBhY2NvcmRpb24gYmFzZWQgb24gdmFsaWRhdGlvbiBlcnJvcnMsIENSVUQgb3BlcmF0aW9ucyxcbiAgICogb3Igb3RoZXIgYnVzaW5lc3MgbG9naWMgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7SW9uQWNjb3JkaW9uR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYWNjb3JkaW9uQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGFjY29yZGlvbkNvbXBvbmVudCE6IElvbkFjY29yZGlvbkdyb3VwO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBuYW1lIG9yIHRpdGxlIG9mIHRoZSBmaWVsZHNldCBzZWN0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBsZWdlbmQgb3IgaGVhZGVyIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBhY2NvcmRpb24gaGVhZGVyLiBUaGlzIHRleHRcbiAgICogcHJvdmlkZXMgYSBjbGVhciBsYWJlbCBmb3IgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24sIGhlbHBpbmcgdXNlcnMgdW5kZXJzdGFuZCB3aGF0IGNvbnRlbnRcbiAgICogaXMgY29udGFpbmVkIHdpdGhpbi4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIHByb21pbmVudGx5IGFuZCBzZXJ2ZXMgYXMgdGhlIGNsaWNrYWJsZSBhcmVhXG4gICAqIGZvciBleHBhbmRpbmcvY29sbGFwc2luZyB0aGUgZmllbGRzZXQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBuYW1lOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGlsZE9mOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB1aWQ6IHN0cmluZyA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdHlwZSBkZWZpbml0aW9ucyBmb3Igc3BlY2lhbGl6ZWQgZmllbGRzZXQgYmVoYXZpb3IuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgY3VzdG9tIGRhdGEgdHlwZXMgb3IgdmFsaWRhdGlvbiBydWxlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgZmllbGRzZXQuXG4gICAqIENhbiBiZSBhIHNpbmdsZSB0eXBlIHN0cmluZyBvciBhcnJheSBvZiB0eXBlcyB0aGF0IGRldGVybWluZSBob3cgdGhlIGZpZWxkc2V0IGhhbmRsZXNcbiAgICogZGF0YSB2YWxpZGF0aW9uLCBmb3JtYXR0aW5nLCBhbmQgZGlzcGxheSBiZWhhdmlvciBmb3Igc3BlY2lhbGl6ZWQgdXNlIGNhc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY3VzdG9tVHlwZXMhOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IENSVUQgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvbXBvbmVudCdzIGluaXRpYWwgYmVoYXZpb3IgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbi5cbiAgICogVGhpcyBpbnB1dCBpcyBjcnVjaWFsIGZvciBhdXRvLXN0YXRlIG1hbmFnZW1lbnQ6IFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zIGF1dG9tYXRpY2FsbHlcbiAgICogb3BlbiB0aGUgZmllbGRzZXQgdG8gc2hvdyBjb250ZW50LCB3aGlsZSBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zIGtlZXAgaXQgY2xvc2VkXG4gICAqIGluaXRpYWxseS4gVGhpcyBwcm92aWRlcyBhbiBpbnR1aXRpdmUgdXNlciBleHBlcmllbmNlIGFsaWduZWQgd2l0aCBvcGVyYXRpb24gc2VtYW50aWNzLlxuICAgKlxuICAgKiBAdHlwZSB7T3BlcmF0aW9uS2V5c31cbiAgICogQGRlZmF1bHQgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgQ1JVRCBvcGVyYXRpb24gdHlwZSBmb3IgdGhlIGN1cnJlbnQgZmllbGRzZXQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgPSBPcGVyYXRpb25LZXlzLlJFQUQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFjdGl2ZSBmb3JtIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYWxsIGZvcm0gY29udHJvbHMgd2l0aGluIHRoaXMgZmllbGRzZXQuXG4gICAqIFVzZWQgZm9yIGZvcm0gdmFsaWRhdGlvbiwgdmFsdWUgbWFuYWdlbWVudCwgYW5kIGludGVncmF0aW9uIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6ICBGb3JtQXJyYXk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IHRpdGxlIHRleHQgZm9yIHRoZSBmaWVsZHNldCBjb250ZW50LlxuICAgKiBAc3VtbWFyeSBEaXNwbGF5IHRpdGxlIHVzZWQgZm9yIGZpZWxkc2V0IGlkZW50aWZpY2F0aW9uIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi5cbiAgICogUHJvdmlkZXMgc2VtYW50aWMgbWVhbmluZyB0byB0aGUgZ3JvdXBlZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlY29uZGFyeSBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBwcm92aWRlcyBjb250ZXh0IG9yIGluc3RydWN0aW9uc1xuICAgKiByZWxhdGVkIHRvIHRoZSBmaWVsZHNldCBjb250ZW50IGFuZCBwdXJwb3NlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRlc2NyaXB0aW9uITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRm9ybSB0YXJnZXQgYXR0cmlidXRlIGZvciBuZXN0ZWQgZm9ybSBzdWJtaXNzaW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3BvbnNlIGFmdGVyIHN1Ym1pdHRpbmcgZm9ybXMgY29udGFpbmVkIHdpdGhpblxuICAgKiB0aGUgZmllbGRzZXQuIFRoaXMgYXR0cmlidXRlIG1pcnJvcnMgdGhlIEhUTUwgZm9ybSB0YXJnZXQgYmVoYXZpb3IsIGFsbG93aW5nIGNvbnRyb2wgb3ZlclxuICAgKiB3aGV0aGVyIGZvcm0gc3VibWlzc2lvbnMgb3BlbiBpbiB0aGUgc2FtZSB3aW5kb3csIG5ldyB3aW5kb3csIG9yIHNwZWNpZmljIGZyYW1lLiBVc2VmdWxcbiAgICogZm9yIGNvbXBsZXggZm9ybSB3b3JrZmxvd3MgYW5kIG11bHRpLXN0ZXAgcHJvY2Vzc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7SFRNTEZvcm1UYXJnZXR9XG4gICAqIEBkZWZhdWx0ICdfc2VsZidcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0YXJnZXQ6IEhUTUxGb3JtVGFyZ2V0ID0gJ19zZWxmJztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBtdWx0aXBsZSBpdGVtIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgZmllbGRzZXQgc3VwcG9ydHMgYWRkaW5nIG11bHRpcGxlIHZhbHVlcy5cbiAgICogV2hlbiB0cnVlLCBkaXNwbGF5cyBhIHJlb3JkZXJhYmxlIGxpc3Qgb2YgaXRlbXMgd2l0aCBhZGQvcmVtb3ZlIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiByYXcgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBhY3R1YWwgZGF0YSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBmaWVsZHNldCdzIGRhdGEgc3RhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIGZpZWxkc2V0IGFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEEgcmVjb3JkIG9mIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGtleWVkIGJ5IGV2ZW50IG5hbWVzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZFxuICAgKiB3aXRoaW4gdGhlIGZpZWxkc2V0LiBUaGVzZSBoYW5kbGVycyBwcm92aWRlIGV4dGVuc2liaWxpdHkgZm9yIGN1c3RvbSBidXNpbmVzcyBsb2dpY1xuICAgKiBhbmQgY2FuIGJlIGludm9rZWQgZm9yIHZhcmlvdXMgZmllbGRzZXQgb3BlcmF0aW9ucyBhbmQgdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtIYW5kbGVyTGlrZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBoYW5kbGVycyE6IEhhbmRsZXJMaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgZm9ybWF0dGVkIGl0ZW1zIGZvciBVSSBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB0aGUgcHJvY2Vzc2VkIGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5IGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoZXNlIGl0ZW1zIGFyZSBtYXBwZWQgZnJvbSB0aGUgcmF3IHZhbHVlcyB1c2luZyB0aGUgbWFwcGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXM6IElGaWVsZFNldEl0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gZm9yIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBIb2xkcyB0aGUgaXRlbSBiZWluZyBlZGl0ZWQgd2hlbiBpbiB1cGRhdGUgbW9kZS4gVXNlZCB0byB0cmFja1xuICAgKiB3aGljaCBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHRoZSBjb3JyZWN0IGl0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHVwZGF0aW5nSXRlbSE6IElGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWQ7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGFjY29yZGlvbiAoZXhwYW5kZWQgb3IgY29sbGFwc2VkKS5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGFjY29yZGlvbiBpcyBjdXJyZW50bHkgb3BlbiBvciBjbG9zZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBtYW5hZ2VkIGJhc2VkIG9uIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBpbml0aWFsIG9wZXJhdGlvbiBzdGF0ZS5cbiAgICogSXQgc2VydmVzIGFzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgY29tcG9uZW50J3MgdmlzaWJpbGl0eSBzdGF0ZSBhbmQgaXMgdXNlZFxuICAgKiB0byBjb29yZGluYXRlIGJldHdlZW4gdXNlciBhY3Rpb25zIGFuZCBwcm9ncmFtbWF0aWMgc3RhdGUgY2hhbmdlcy4gVGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHlcbiAgICogc2V0IGJhc2VkIG9uIENSVUQgb3BlcmF0aW9ucyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHVwZGF0ZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGRzZXQgY29udGFpbnMgcmVxdWlyZWQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IEJvb2xlYW4gZmxhZyB0aGF0IHNpZ25hbHMgdGhlIHByZXNlbmNlIG9mIG1hbmRhdG9yeSBpbnB1dCBmaWVsZHMgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgQ29sbGFwc2FibGVEaXJlY3RpdmUgd2hlbiByZXF1aXJlZCBmaWVsZHMgYXJlIGRldGVjdGVkLFxuICAgKiBhbmQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc3BlY2lhbCBzdHlsaW5nLCB2YWxpZGF0aW9uIGxvZ2ljLCBvciBVSSBpbmRpY2F0b3JzIHRvIGhpZ2hsaWdodFxuICAgKiBmaWVsZHNldHMgdGhhdCBjb250YWluIG1hbmRhdG9yeSBpbmZvcm1hdGlvbi4gSXQgaGVscHMgd2l0aCBmb3JtIHZhbGlkYXRpb24gZmVlZGJhY2sgYW5kXG4gICAqIHVzZXIgZXhwZXJpZW5jZSBieSBtYWtpbmcgcmVxdWlyZWQgc2VjdGlvbnMgbW9yZSBwcm9taW5lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIGlmIGFueSBmb3JtIGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0IGhhdmUgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBjb250cm9sIGFjY29yZGlvbiBiZWhhdmlvciB3aGVuIGVycm9ycyBhcmUgcHJlc2VudCwgcHJldmVudGluZ1xuICAgKiB1c2VycyBmcm9tIGNvbGxhcHNpbmcgdGhlIGFjY29yZGlvbiB3aGVuIHRoZXkgbmVlZCB0byBzZWUgYW5kIGFkZHJlc3MgdmFsaWRhdGlvbiBpc3N1ZXMuXG4gICAqIEl0J3MgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gdmFsaWRhdGlvbiBlcnJvciBldmVudHMgYXJlIHJlY2VpdmVkIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhc1ZhbGlkYXRpb25FcnJvcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZSBmb3IgZHVwbGljYXRlIHZhbHVlcy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFkZCBhIGR1cGxpY2F0ZSB2YWx1ZVxuICAgKiB0byB0aGUgZmllbGRzZXQuIFVzZWQgdG8gZGlzcGxheSB1bmlxdWVuZXNzIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNVbmlxdWVFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIENSVUQgb3BlcmF0aW9uIGNvbnN0YW50cyBmb3IgdGVtcGxhdGUgdXNhZ2UuXG4gICAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIE9wZXJhdGlvbktleXMgZW51bSB0byB0aGUgY29tcG9uZW50IHRlbXBsYXRlLCBlbmFibGluZyBjb25kaXRpb25hbFxuICAgKiByZW5kZXJpbmcgYW5kIGJlaGF2aW9yIGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlcy4gVGhpcyBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydHkgZW5zdXJlc1xuICAgKiB0aGF0IHRlbXBsYXRlIGxvZ2ljIGNhbiBhY2Nlc3Mgb3BlcmF0aW9uIGNvbnN0YW50cyB3aGlsZSBtYWludGFpbmluZyBlbmNhcHN1bGF0aW9uIGFuZFxuICAgKiBwcmV2ZW50aW5nIGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIG9mIHRoZSBlbnVtIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge0NydWRPcGVyYXRpb25zfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzOiBDcnVkT3BlcmF0aW9ucyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNlcnZpY2UuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBtYW51YWwgY29udHJvbCBvdmVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLlxuICAgKiBUaGlzIGlzIGVzc2VudGlhbCBmb3IgZW5zdXJpbmcgdGhhdCBwcm9ncmFtbWF0aWMgRE9NIGNoYW5nZXMgKGxpa2Ugc2V0dGluZyBhY2NvcmRpb25cbiAgICogYXR0cmlidXRlcykgYXJlIHByb3Blcmx5IHJlZmxlY3RlZCBpbiB0aGUgY29tcG9uZW50J3Mgc3RhdGUgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGVcbiAgICogdmlldyB1cGRhdGVzIHdoZW4gbW9kaWZpY2F0aW9ucyBvY2N1ciBvdXRzaWRlIHRoZSBub3JtYWwgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIGZsb3cuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIFJlbmRlcmVyMiBzZXJ2aWNlIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBhIHNhZmUsIHBsYXRmb3JtLWFnbm9zdGljIHdheSB0byBtYW5pcHVsYXRlIERPTSBlbGVtZW50cy5cbiAgICogVGhpcyBzZXJ2aWNlIGVuc3VyZXMgcHJvcGVyIGhhbmRsaW5nIG9mIERPTSBvcGVyYXRpb25zIGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zIGFuZCBlbnZpcm9ubWVudHMsXG4gICAqIGluY2x1ZGluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIHdlYiB3b3JrZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVuZGVyZXIyfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRpb24gc2VydmljZSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0cmFuc2xhdGlvbiBjYXBhYmlsaXRpZXMgZm9yIFVJIHRleHQuXG4gICAqIFVzZWQgdG8gdHJhbnNsYXRlIGJ1dHRvbiBsYWJlbHMgYW5kIHZhbGlkYXRpb24gbWVzc2FnZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7VHJhbnNsYXRlU2VydmljZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2NhbGl6ZWQgbGFiZWwgdGV4dCBmb3IgYWN0aW9uIGJ1dHRvbnMuXG4gICAqIEBzdW1tYXJ5IER5bmFtaWMgYnV0dG9uIGxhYmVsIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbW9kZS5cbiAgICogU2hvd3MgXCJBZGRcIiBmb3IgY3JlYXRlIG9wZXJhdGlvbnMgYW5kIFwiVXBkYXRlXCIgZm9yIGVkaXQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBidXR0b25MYWJlbCE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9jYWxpemVkIGxhYmVsIHRleHQgZm9yIGFjdGlvbiBidXR0b25zLlxuICAgKiBAc3VtbWFyeSBEeW5hbWljIGJ1dHRvbiBsYWJlbCB0aGF0IGNoYW5nZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuXG4gICAqIFNob3dzIFwiQ2FuY2VsXCIgZm9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgYnV0dG9uQ2FuY2VsTGFiZWwhOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBmaWVsZHNldCB3aXRoIGljb25zIGFuZCBjb21wb25lbnQgbmFtZS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBOZ3hCYXNlQ29tcG9uZW50IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGFuZFxuICAgKiByZXF1aXJlZCBJb25pYyBpY29ucyAoYWxlcnRDaXJjbGVPdXRsaW5lIGZvciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgY3JlYXRlT3V0bGluZSBmb3IgYWRkIGFjdGlvbnMpLlxuICAgKiBTZXRzIHVwIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50IHN0cnVjdHVyZSBhbmQgaWNvbiByZWdpc3RyeS5cbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignRmllbGRzZXRDb21wb25lbnQnKTtcbiAgICBhZGRJY29ucyh7IGFsZXJ0Q2lyY2xlT3V0bGluZSwgY3JlYXRlT3V0bGluZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYnkgc2V0dGluZyB1cCByZXBvc2l0b3J5IHJlbGF0aW9uc2hpcHMgaWYgYSBtb2RlbCBleGlzdHMsXG4gICAqIGFuZCBjb25maWd1cmVzIHRoZSBpbml0aWFsIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIGFkZCBhY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHByb3BlciBzZXR1cCBvZiB0cmFuc2xhdGlvbiBzZXJ2aWNlcyBhbmQgY29tcG9uZW50IHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm1vZGVsKVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMuYnV0dG9uQ2FuY2VsTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuY2FuY2VsJyk7XG4gIH1cblxuICAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IHN0YXRlIGFmdGVyIHZpZXcgYW5kIGNoaWxkIGNvbXBvbmVudHMgYXJlIHJlbmRlcmVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIGxpZmVjeWNsZSBob29rIGltcGxlbWVudHMgaW50ZWxsaWdlbnQgYXV0by1zdGF0ZSBtYW5hZ2VtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50XG4gICAqIENSVUQgb3BlcmF0aW9uLiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIHRoZSBmaWVsZHNldCBhdXRvbWF0aWNhbGx5IG9wZW5zIHRvIHByb3ZpZGVcbiAgICogaW1tZWRpYXRlIGFjY2VzcyB0byBpbmZvcm1hdGlvbiwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZCB0byBtYWludGFpblxuICAgKiBhIGNsZWFuIGluaXRpYWwgaW50ZXJmYWNlLiBUaGUgbWV0aG9kIGRpcmVjdGx5IG1hbmlwdWxhdGVzIHRoZSBET00gdG8gZW5zdXJlIHByb3BlciBhY2NvcmRpb25cbiAgICogc3luY2hyb25pemF0aW9uIGFuZCB0cmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJlZmxlY3QgdGhlIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBGaWVsZHNldENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDaGFuZ2VEZXRlY3RvclxuICAgKlxuICAgKiAgIEEtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICAgKiAgIGFsdCBvcGVyYXRpb24gaXMgUkVBRCBvciBERUxFVEVcbiAgICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICAgKiAgICAgRi0+PkQ6IFF1ZXJ5IGlvbi1hY2NvcmRpb24tZ3JvdXAgZWxlbWVudFxuICAgKiAgICAgYWx0IGFjY29yZGlvbiBlbGVtZW50IGV4aXN0c1xuICAgKiAgICAgICBGLT4+RDogU2V0IHZhbHVlIGF0dHJpYnV0ZSB0byAnb3BlbidcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5DOiBkZXRlY3RDaGFuZ2VzKClcbiAgICogICBDLT4+RjogVXBkYXRlIHZpZXcgd2l0aCBuZXcgc3RhdGVcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5SRUFEIHx8IHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSkge1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgLy8gaGlkZGVuIHJlbW92ZSBidXR0b25cbiAgICAgIGNvbnN0IGFjY29yZGlvbkVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpb24tYWNjb3JkaW9uLWdyb3VwJyk7XG4gICAgICBpZih0aGlzLmFjY29yZGlvbkNvbXBvbmVudClcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYWNjb3JkaW9uRWxlbWVudCwgJ3ZhbHVlJywgJ29wZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5jb21wb25lbnQ/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JlcXVpcmVkXScpO1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gaW5wdXRzLmxlbmd0aCA+IDA7XG4gICAgICBpZih0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gICAgICAgIHRoaXMuaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHJlbW92YWwgb2YgdGhlIGZpZWxkc2V0IHdpdGggc2xpZGUgYW5pbWF0aW9uLlxuICAgKiBAc3VtbWFyeSBJbml0aWF0ZXMgdGhlIHJlbW92YWwgcHJvY2VzcyBmb3IgdGhlIGZpZWxkc2V0IHdpdGggYSBzbW9vdGggc2xpZGUtdXAgYW5pbWF0aW9uLlxuICAgKiBUaGUgbWV0aG9kIGFwcGxpZXMgQ1NTIGNsYXNzZXMgZm9yIHRoZSBzbGlkZSBhbmltYXRpb24gYW5kIHRoZW4gc2FmZWx5IHJlbW92ZXMgdGhlXG4gICAqIGVsZW1lbnQgZnJvbSB0aGUgRE9NIHVzaW5nIFJlbmRlcmVyMi4gVGhpcyBwcm92aWRlcyBhIHBvbGlzaGVkIHVzZXIgZXhwZXJpZW5jZVxuICAgKiB3aGVuIHJlbW92aW5nIGZpZWxkc2V0IGluc3RhbmNlcyBmcm9tIGR5bmFtaWMgZm9ybXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gRE9NIGV2ZW50IGZyb20gdGhlIHJlbW92ZSBidXR0b24gY2xpY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlQ29tcG9uZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGNmLWFuaW1hdGlvbicsICdkY2YtYW5pbWF0aW9uLXNsaWRlLXRvcC1tZWRpdW0nLCAnZGNmLWFuaW1hdGlvbi1yZXZlcnNlJywgJ2RjZi1hbmltYXRpb24tZmFzdCcpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gVXNlIFJlbmRlcmVyMiB0byBzYWZlbHkgcmVtb3ZlIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICBpZiAocGFyZW50KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfSwgMTUwKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNyZWF0aW5nIG5ldyBpdGVtcyBvciB0cmlnZ2VyaW5nIGdyb3VwIGFkZGl0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZvcm0gdmFsaWRhdGlvbiBldmVudHMgZm9yIGl0ZW0gY3JlYXRpb24gb3IgZW1pdHMgZXZlbnRzIHRvIHRyaWdnZXJcbiAgICogdGhlIGFkZGl0aW9uIG9mIG5ldyBmaWVsZHNldCBncm91cHMuIFdoZW4gY2FsbGVkIHdpdGggdmFsaWRhdGlvbiBldmVudCBkYXRhLCBpdCB2YWxpZGF0ZXNcbiAgICogdW5pcXVlbmVzcyBhbmQgYWRkcyB0aGUgaXRlbSB0byB0aGUgZmllbGRzZXQuIFdoZW4gY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycywgaXQgdHJpZ2dlcnNcbiAgICogYSBncm91cCBhZGRpdGlvbiBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudHMgdG8gaGFuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD59IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGNvbnRhaW5pbmcgZm9ybSBkYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDYWxsZWQgZnJvbSBmb3JtIHZhbGlkYXRpb25cbiAgICogaGFuZGxlQ3JlYXRlSXRlbSh2YWxpZGF0aW9uRXZlbnQpO1xuICAgKlxuICAgKiAvLyBDYWxsZWQgdG8gdHJpZ2dlciBncm91cCBhZGRpdGlvblxuICAgKiBoYW5kbGVDcmVhdGVJdGVtKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlSXRlbShldmVudD86IEN1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCAmJiBldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtmb3JtR3JvdXAsIHZhbHVlLCBpc1ZhbGlkfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gZm9ybUdyb3VwIGFzIEZvcm1BcnJheTtcbiAgICAgIGlmKCF0aGlzLm1hcHBlcilcbiAgICAgICAgdGhpcy5tYXBwZXIgPSB0aGlzLmdldE1hcHBlcih2YWx1ZSBhcyBLZXlWYWx1ZSk7XG4gICAgICBpZihpc1ZhbGlkICl7XG4gICAgICAgICAgdGhpcy5pc1VuaXF1ZUVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuYWRkJyk7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICB0aGlzLmlzVW5pcXVlRXJyb3IgPSAodmFsdWUgYXMgS2V5VmFsdWUpPy5bdGhpcy5wa10gfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfQUREX0dST1VQLCB7XG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgaW5kZXg6IHRoaXMudXBkYXRpbmdJdGVtID8gdGhpcy51cGRhdGluZ0l0ZW0uaW5kZXggOiB0aGlzLnZhbHVlPy5sZW5ndGgsXG4gICAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgICBvcGVyYXRpb246ICF0aGlzLnVwZGF0aW5nSXRlbSA/IE9wZXJhdGlvbktleXMuQ1JFQVRFIDogT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gdXBkYXRlIG9wZXJhdGlvbnMgd2l0aCBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IExvY2F0ZXMgYW4gaXRlbSBpbiB0aGUgZm9ybSBhcnJheSBmb3IgZWRpdGluZyBhbmQgcHJlcGFyZXMgdGhlIGNvbXBvbmVudFxuICAgKiBmb3IgdXBkYXRlIG1vZGUuIFVwZGF0ZXMgdGhlIGJ1dHRvbiBsYWJlbCB0byByZWZsZWN0IHRoZSBlZGl0IHN0YXRlIGFuZCBzdG9yZXNcbiAgICogdGhlIGl0ZW0gYmVpbmcgdXBkYXRlZC4gVHJpZ2dlcnMgYSB3aW5kb3cgZXZlbnQgdG8gbm90aWZ5IHBhcmVudCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgLSBUaGUgaWRlbnRpZmllciB2YWx1ZSBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGFycmF5IGluZGV4IHBvc2l0aW9uIG9mIHRoZSBpdGVtXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVVwZGF0ZUl0ZW0odmFsdWU6IHN0cmluZyB8IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gYCR7Y29udHJvbC5nZXQodGhpcy5wayk/LnZhbHVlfWAudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5TcGFjZXMoYCR7dmFsdWV9YCwgdHJ1ZSkpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmKGl0ZW0pIHtcbiAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcudXBkYXRlJyk7XG4gICAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0udmFsdWUgfHwge30sIHtpbmRleH0pO1xuICAgICAgd2luZG93RXZlbnRFbWl0dGVyKEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX1VQREFURV9HUk9VUCwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FuY2VscyB0aGUgdXBkYXRlIG1vZGUgYW5kIHJlc2V0cyB0aGUgVUkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IEV4aXRzIHRoZSB1cGRhdGUgbW9kZSBieSByZXNldHRpbmcgdGhlIGJ1dHRvbiBsYWJlbCBhbmQgY2xlYXJpbmcgdGhlIHVwZGF0aW5nIGl0ZW0sXG4gICAqIHJlc3RvcmluZyB0aGUgY29tcG9uZW50IHRvIGl0cyBkZWZhdWx0IHN0YXRlIGZvciBhZGRpbmcgbmV3IGl0ZW1zLiBOb3RpZmllcyBwYXJlbnQgY29tcG9uZW50c1xuICAgKiB0aGF0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMudXBkYXRpbmdJdGVtID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgaW5kZXg6IHRoaXMudmFsdWU/Lmxlbmd0aFxuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgaXRlbSByZW1vdmFsIG9wZXJhdGlvbnMgd2l0aCBmb3JtIGFycmF5IG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBpdGVtIHJlbW92YWwgYnkgZWl0aGVyIGhhbmRsaW5nIHZhbGlkYXRpb24gZXZlbnRzIG9yIHJlbW92aW5nIHNwZWNpZmljXG4gICAqIGl0ZW1zIGZyb20gdGhlIGZvcm0gYXJyYXkuIFdoZW4gY2FsbGVkIHdpdGggYSB2YWxpZGF0aW9uIGV2ZW50LCBpdCB0cmlnZ2VycyB2YWx1ZSB1cGRhdGVzLlxuICAgKiBXaGVuIGNhbGxlZCB3aXRoIGFuIGlkZW50aWZpZXIsIGl0IGxvY2F0ZXMgYW5kIHJlbW92ZXMgdGhlIG1hdGNoaW5nIGl0ZW0gZnJvbSB0aGUgZm9ybSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGZvciBmb3JtIHVwZGF0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlSXRlbSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7XG4gICAgY29uc3QgYXJyYXlMZW5ndGggPSBmb3JtQXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXlMZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBncm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGNsZWFuU3BhY2VzKGdyb3VwLmdldCh0aGlzLnBrKT8udmFsdWUpID09PSBjbGVhblNwYWNlcyh2YWx1ZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9SRU1PVkVfR1JPVVAsIHtcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgZm9ybUdyb3VwOiBncm91cFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZW9yZGVyaW5nIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGRzZXQgbGlzdC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGRyYWctYW5kLWRyb3AgcmVvcmRlciBldmVudHMgZnJvbSB0aGUgaW9uLXJlb3JkZXItZ3JvdXAgY29tcG9uZW50LlxuICAgKiBVcGRhdGVzIGJvdGggdGhlIGRpc3BsYXkgaXRlbXMgYXJyYXkgYW5kIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGFycmF5IHRvIG1haW50YWluXG4gICAqIGNvbnNpc3RlbmN5IGJldHdlZW4gVUkgc3RhdGUgYW5kIGRhdGEgc3RhdGUuIFByZXNlcnZlcyBpdGVtIGluZGljZXMgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJdGVtUmVvcmRlckV2ZW50RGV0YWlsPn0gZXZlbnQgLSBJb25pYyByZW9yZGVyIGV2ZW50IGNvbnRhaW5pbmcgc291cmNlIGFuZCB0YXJnZXQgaW5kaWNlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGh0bWxcbiAgICogPGlvbi1yZW9yZGVyLWdyb3VwIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVyKCRldmVudClcIj5cbiAgICogICA8IS0tIFJlb3JkZXJhYmxlIGl0ZW1zIC0tPlxuICAgKiA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgKiBgYGBcbiAgICovXG4gIGhhbmRsZVJlb3JkZXJJdGVtcyhldmVudDogQ3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD4pOiB2b2lkIHtcbiAgIGNvbnN0IGZyb21JbmRleCA9IGV2ZW50LmRldGFpbC5mcm9tO1xuICAgIGNvbnN0IHRvSW5kZXggPSBldmVudC5kZXRhaWwudG87XG5cbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXTsgLy8gc3VhIGVzdHJ1dHVyYSB2aXN1YWxcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7IC8vIEZvcm1BcnJheSByZWF0aXZvXG5cbiAgICBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAvLyBSZW9yZGVuYXIgb3MgZGFkb3MgdmlzdWFpc1xuICAgICAgY29uc3QgaXRlbVRvTW92ZSA9IGl0ZW1zLnNwbGljZShmcm9tSW5kZXgsIDEpWzBdO1xuICAgICAgaXRlbXMuc3BsaWNlKHRvSW5kZXgsIDAsIGl0ZW1Ub01vdmUpO1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IGl0ZW1bJ2luZGV4J10gPSBpbmRleCArIDEpO1xuXG4gICAgICAvLyBSZW9yZGVuYXIgb3MgY29udHJvbGVzIGRvIEZvcm1BcnJheVxuICAgICAgY29uc3QgY29udHJvbFRvTW92ZSA9IGZvcm1BcnJheS5hdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGZyb21JbmRleCk7XG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KHRvSW5kZXgsIGNvbnRyb2xUb01vdmUpO1xuICAgIH1cbiAgICAvLyBGaW5hbGl6YSBhIG9wZXJhw6fDo28gZGUgcmVvcmRlciBkbyBJb25pY1xuICAgIGV2ZW50LmRldGFpbC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGFjY29yZGlvbiBzdGF0ZSBjaGFuZ2UgZXZlbnRzIGZyb20gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBDdXN0b21FdmVudCBvYmplY3RzIHRyaWdnZXJlZCB3aGVuIHVzZXJzIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgYWNjb3JkaW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgbmV3IHN0YXRlIGZyb20gdGhlIGV2ZW50IGRldGFpbHMgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGludGVybmFsIHN0YXRlIGFjY29yZGluZ2x5LiBJdCBzcGVjaWZpY2FsbHkgbGlzdGVucyBmb3IgSU9OLUFDQ09SRElPTi1HUk9VUCBldmVudHMgdG9cbiAgICogZW5zdXJlIHByb3BlciBldmVudCBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgcHJldmVudCBoYW5kbGluZyBvZiB1bnJlbGF0ZWQgZXZlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgY29udGFpbmluZyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uLUFjY29yZGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogICBVLT4+STogQ2xpY2sgYWNjb3JkaW9uIGhlYWRlclxuICAgKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoQ3VzdG9tRXZlbnQpXG4gICAqICAgRi0+PkY6IEV4dHJhY3QgdGFyZ2V0IGFuZCBkZXRhaWwgZnJvbSBldmVudFxuICAgKiAgIEYtPj5GOiBWYWxpZGF0ZSB0YXJnZXQgaXMgSU9OLUFDQ09SRElPTi1HUk9VUFxuICAgKiAgIGFsdCB2YWxpZCB0YXJnZXRcbiAgICogICAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuID0gISF2YWx1ZVxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5JOiBSZWZsZWN0IHVwZGF0ZWQgc3RhdGVcbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gdG9nZ2xlIGZ1bmN0aW9uYWxpdHkgd2l0aCB2YWxpZGF0aW9uIGVycm9yIGNvbnNpZGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IE1hbmFnZXMgdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIHdoaWxlIHJlc3BlY3RpbmcgdmFsaWRhdGlvbiBlcnJvciBzdGF0ZXMuXG4gICAqIFdoZW4gdmFsaWRhdGlvbiBlcnJvcnMgYXJlIHByZXNlbnQsIHRoZSBhY2NvcmRpb24gY2Fubm90IGJlIGNvbGxhcHNlZCB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZVxuICAgKiBhbmQgYWRkcmVzcyB0aGUgZXJyb3JzLiBXaGVuIG5vIGVycm9ycyBleGlzdCwgdXNlcnMgY2FuIGZyZWVseSB0b2dnbGUgdGhlIGFjY29yZGlvbiBzdGF0ZS5cbiAgICogVGhpcyBtZXRob2QgYWxzbyBzdG9wcyBldmVudCBwcm9wYWdhdGlvbiB0byBwcmV2ZW50IHVud2FudGVkIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gW2V2ZW50XSAtIE9wdGlvbmFsIGV2ZW50IG9iamVjdCBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKGV2ZW50PzogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBpZihldmVudClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGlmKCF0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gdGhpcy5pc09wZW4gPyB1bmRlZmluZWQgOiAnb3Blbic7XG4gICAgICB0aGlzLmlzT3BlbiA9ICEhdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3IgZXZlbnRzIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBkaXNwYXRjaGVkIGJ5IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQuXG4gICAqIFdoZW4gZXJyb3JzIGFyZSBkZXRlY3RlZCwgdGhlIGFjY29yZGlvbiBpcyBmb3JjZWQgb3BlbiBhbmQgcHJldmVudGVkIGZyb20gY29sbGFwc2luZ1xuICAgKiB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4gVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29tcG9uZW50J3NcbiAgICogZXJyb3Igc3RhdGUgYW5kIGFjY29yZGlvbiB2aXNpYmlsaXR5IGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIEN1c3RvbSBldmVudCBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3IgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVWYWxpZGF0aW9uRXJyb3IoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qge2hhc0Vycm9yc30gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy5pc09wZW4gPSB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSBoYXNFcnJvcnM7XG4gICAgaWYoaGFzRXJyb3JzKVxuICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGFuZCBzdG9yZXMgYSBuZXcgb3IgdXBkYXRlZCB2YWx1ZSBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zIGZvciBmaWVsZHNldCBpdGVtcy4gUGFyc2VzIGFuZCBjbGVhbnNcbiAgICogdGhlIGlucHV0IHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgdXBkYXRpbmcgc3RhdGUsIGFuZCBlaXRoZXJcbiAgICogYWRkcyBhIG5ldyBpdGVtIG9yIHVwZGF0ZXMgYW4gZXhpc3Rpbmcgb25lLiBNYWludGFpbnMgZGF0YSBpbnRlZ3JpdHkgYW5kIFVJIGNvbnNpc3RlbmN5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHNldFZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5KS5jb250cm9scy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy52YWx1ZVxuICAgIC5maWx0ZXIodiA9PiB2W3RoaXMucGtdICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgodiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW1NYXBwZXIoT2JqZWN0LmFzc2lnbih7fSwgdiksIHRoaXMubWFwcGVyKSxcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMVxuICAgICAgfSBhcyBJRmllbGRTZXRJdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0Q29udGFpbmVycyA9IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRjZi1pbnB1dC1pdGVtJyk7XG4gICAgaW5wdXRDb250YWluZXJzLmZvckVhY2goKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCBpb24taW5wdXQsIGlvbi10ZXh0YXJlYSwgdGV4dGFyZWEnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmKGlucHV0KVxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH0pXG4gICAgdGhpcy51cGRhdGluZ0l0ZW0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgZmllbGQgbWFwcGluZyBiYXNlZCBvbiB0aGUgdmFsdWUgc3RydWN0dXJlLlxuICAgKiBAc3VtbWFyeSBBbmFseXplcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBwcmltYXJ5IGtleVxuICAgKiBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGZpZWxkIG1hcHBpbmdzIGZvciBkaXNwbGF5IHB1cnBvc2VzLiBTZXRzIHVwIHRoZSBtYXBwZXIgb2JqZWN0XG4gICAqIHdpdGggdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW5kZXggZmllbGRzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IHZhbHVlIC0gU2FtcGxlIHZhbHVlIG9iamVjdCB1c2VkIHRvIGRldGVybWluZSBmaWVsZCBtYXBwaW5nc1xuICAgKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBjb25maWd1cmVkIG1hcHBlciBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGdldE1hcHBlcih2YWx1ZTogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gICAgaWYoIXRoaXMucGspXG4gICAgICB0aGlzLnBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgIGlmKCFPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoKVxuICAgICAgdGhpcy5tYXBwZXJbJ3RpdGxlJ10gPSB0aGlzLnBrO1xuICAgIHRoaXMubWFwcGVyWydpbmRleCddID0gXCJpbmRleFwiO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPj0gMiB8fCBPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoID09PSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmKCF0aGlzLm1hcHBlclsndGl0bGUnXSkge1xuICAgICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwcGVyWydkZXNjcmlwdGlvbiddID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXBwZXI7XG4gIH1cbn1cbiIsIlxuXG48ZmllbGRzZXRcbiAgKGZpZWxkc2V0QWRkR3JvdXBFdmVudCk9XCJoYW5kbGVDcmVhdGVJdGVtKCRldmVudClcIlxuICAoZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KT1cImhhbmRsZVJlbW92ZUl0ZW0odW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgW2NsYXNzXT1cIidkY2YtZmllbGRzZXQgJyArIG9wZXJhdGlvblwiXG4gICNjb21wb25lbnQ+XG4gIDxpb24tYWNjb3JkaW9uLWdyb3VwIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiIFtjbGFzcy5oYXNWYWxpZGF0aW9uRXJyb3JzXT1cImhhc1ZhbGlkYXRpb25FcnJvcnNcIiAodmFsaWRhdGlvbkVycm9yRXZlbnQpPVwiaGFuZGxlVmFsaWRhdGlvbkVycm9yKCRldmVudClcIiAjYWNjb3JkaW9uQ29tcG9uZW50PlxuICAgIDxpb24tYWNjb3JkaW9uIHZhbHVlPVwib3BlblwiPlxuICAgICAgPGlvbi1pdGVtIHNsb3Q9XCJoZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZSBkY2Ytd2lkdGgtMS0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+e3sgbmFtZSB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZighaXNSZXF1aXJlZCAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWF1dG8gZGNmLWRlbGV0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlQ29tcG9uZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiZGNmLWZpZWxkcy1saXN0XCI+XG4gICAgICAgICAgICA8aW9uLXJlb3JkZXItZ3JvdXAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXAucGFyZW50XCIgW2Rpc2FibGVkXT1cInVwZGF0aW5nSXRlbVwiIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVySXRlbXMoJGFueSgkZXZlbnQpKVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIDxpb24taXRlbSBbY2xhc3Mubm90LXVuaXF1ZV09XCJpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yXCIgIFtjbGFzcy51cGRhdGluZ109XCJ1cGRhdGluZ0l0ZW0/Lltwa10gPT09IGl0ZW0udGl0bGVcIiBsaW5lcz1cImZ1bGxcIiBbYnV0dG9uXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbXM/Lmxlbmd0aCA+IDEgJiYgIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLXJlb3JkZXIgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzd2FwLXZlcnRpY2FsLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1yZW9yZGVyPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZGNmLXJlb3JkZXItZGlzYWJsZWRcIiBzaXplPVwic21hbGxcIiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCIgZGlzYWJsZWQ+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtjb2xvcl09XCIoaXRlbS50aXRsZSA9PT0gaXNVbmlxdWVFcnJvciAmJiAhdXBkYXRpbmdJdGVtPy5bcGtdID09PSBpdGVtLnRpdGxlKSA/ICdkYW5nZXInIDogJydcIj57eyBpdGVtLmluZGV4IH19LiB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiZGNmLXN1YnRpdGxlXCI+e3tpdGVtLmRlc2NyaXB0aW9ufX08L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtIHx8IHVwZGF0aW5nSXRlbT8uW3BrXSAhPT0gaXRlbS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlVXBkYXRlSXRlbShpdGVtLnRpdGxlLCAkaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjcmVhdGUtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVSZW1vdmVJdGVtKGl0ZW0udGl0bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgQGlmKG11bHRpcGxlICYmIFsnY3JlYXRlJywgJ3VwZGF0ZSddLmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBAaWYoaXNVbmlxdWVFcnJvcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ub3QtdW5pcXVlLWNvbnRhaW5lciBkY2YtYW5pbWF0aW9uIGRjZi1hbmltYXRpb24tYm90dG9tLXNtYWxsIGRjZi1hbmltYXRpb24tZmFzdFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi13aWR0aC0xLTEgXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1hdXRvXCIgW2F0dHIuc3R5bGVdPVwiJ21heC13aWR0aDogNTBweCdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWxlcnQtY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtZXhwYW5kXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImRjZi10ZXh0LXNtYWxsXCI+e3sgbG9jYWxlICsgJy5ub3RfdW5pcXVlJyB8IHRyYW5zbGF0ZSA6IHsgdmFsdWU6IGlzVW5pcXVlRXJyb3IgfSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtbWFyZ2luLWJvdHRvbSBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleFwiPlxuICAgICAgICAgICAgQGlmKHVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhbmdlclwiIChjbGljayk9XCJoYW5kbGVDYW5jZWxVcGRhdGVJdGVtKClcIj5cbiAgICAgICAgICAgICAgICB7eyBidXR0b25DYW5jZWxMYWJlbCB9fVxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBmaWxsPVwiY2xlYXJcIiBjbGFzcz1cImRjZi1idXR0b24tYWRkXCIgKGNsaWNrKT1cImhhbmRsZUNyZWF0ZUl0ZW0oKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3tidXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2lvbi1hY2NvcmRpb24+XG4gIDwvaW9uLWFjY29yZGlvbi1ncm91cD5cbjwvZmllbGRzZXQ+XG5cbiJdfQ==
677
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxTCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUtwQzs7Ozs7Ozs7Ozs7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TixRQUFRO3NCQURQLEtBQUs7Z0JBYU4sS0FBSztzQkFESixLQUFLO2dCQWFOLFFBQVE7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEhhbmRsZXJMaWtlLCBIVE1MRm9ybVRhcmdldCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJb25BY2NvcmRpb24sIElvbkFjY29yZGlvbkdyb3VwLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsLCBJb25MaXN0LCBJdGVtUmVvcmRlckV2ZW50RGV0YWlsLCBJb25SZW9yZGVyR3JvdXAsIElvblJlb3JkZXIsIElvbkljb24sIElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZW5lcmF0ZVJhbmRvbVZhbHVlLCBpdGVtTWFwcGVyLCB3aW5kb3dFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUZpZWxkU2V0SXRlbSwgSUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIER5bmFtaWMgZmllbGRzZXQgY29tcG9uZW50IHdpdGggY29sbGFwc2libGUgYWNjb3JkaW9uIGZ1bmN0aW9uYWxpdHkuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHNvcGhpc3RpY2F0ZWQgZmllbGRzZXQgY29udGFpbmVyIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHRzIGl0cyBiZWhhdmlvciBiYXNlZCBvbiBDUlVEIG9wZXJhdGlvbnMuIEl0IGludGVncmF0ZXMgc2VhbWxlc3NseSB3aXRoIElvbmljJ3NcbiAqIGFjY29yZGlvbiBjb21wb25lbnRzIHRvIGNyZWF0ZSBleHBhbmRhYmxlL2NvbGxhcHNpYmxlIHNlY3Rpb25zIGZvciBvcmdhbml6aW5nIGZvcm1cbiAqIGNvbnRlbnQgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24uIFRoZSBjb21wb25lbnQgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmVzIGl0cyBpbml0aWFsXG4gKiBzdGF0ZSBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUsIG9wZW5pbmcgYXV0b21hdGljYWxseSBmb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnNcbiAqIHdoaWxlIHJlbWFpbmluZyBjbG9zZWQgZm9yIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgc3RhdGUgbWFuYWdlbWVudCAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIlBlcnNvbmFsIEluZm9ybWF0aW9uXCJcbiAqICAgW29wZXJhdGlvbl09XCJPcGVyYXRpb25LZXlzLlJFQURcIlxuICogICB0YXJnZXQ9XCJfc2VsZlwiPlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiTmFtZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbmFtZVwiPjwvaW9uLWlucHV0PlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiRW1haWxcIiB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGVtYWlsXCI+PC9pb24taW5wdXQ+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqXG4gKiA8IS0tIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIG9wZXJhdGlvbiAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIkNvbnRhY3QgRGV0YWlsc1wiXG4gKiAgIFtvcGVyYXRpb25dPVwiY3VycmVudE9wZXJhdGlvblwiXG4gKiAgIHRhcmdldD1cIl9ibGFua1wiPlxuICogICA8IS0tIENvbXBsZXggZm9ybSBmaWVsZHMgLS0+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgSSBhcyBJb25pYyBBY2NvcmRpb25cbiAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAqXG4gKiAgIEYtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICogICBhbHQgb3BlcmF0aW9uIGlzIFJFQUQgb3IgREVMRVRFXG4gKiAgICAgRi0+PkY6IFNldCBpc09wZW4gPSB0cnVlXG4gKiAgICAgRi0+PkQ6IFF1ZXJ5IGFjY29yZGlvbiBlbGVtZW50XG4gKiAgICAgRi0+Pkk6IFNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gJ29wZW4nXG4gKiAgICAgRi0+PkY6IFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICogICBlbmRcbiAqICAgVS0+Pkk6IENsaWNrIGFjY29yZGlvbiBoZWFkZXJcbiAqICAgSS0+PkY6IGhhbmRsZUNoYW5nZShldmVudClcbiAqICAgRi0+PkY6IFVwZGF0ZSBpc09wZW4gc3RhdGVcbiAqICAgRi0+Pkk6IFJlZmxlY3QgbmV3IHN0YXRlXG4gKlxuICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkFjY29yZGlvbkdyb3VwLFxuICAgIElvbkFjY29yZGlvbixcbiAgICBJb25MaXN0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25SZW9yZGVyLFxuICAgIElvblJlb3JkZXJHcm91cCxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uSWNvbixcbiAgXSxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAnb3ZlcnJpb2RlICd9LFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZHNldENvbXBvbmVudCBleHRlbmRzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgaW9uLWFjY29yZGlvbi1ncm91cCBjb21wb25lbnQgZm9yIHByb2dyYW1tYXRpYyBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgSW9uaWMgYWNjb3JkaW9uIGdyb3VwIGNvbXBvbmVudC5cbiAgICogVGhpcyBlbmFibGVzIHByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgdGhlIGFjY29yZGlvbidzIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSwgYWxsb3dpbmdcbiAgICogdGhlIGNvbXBvbmVudCB0byBvcGVuL2Nsb3NlIHRoZSBhY2NvcmRpb24gYmFzZWQgb24gdmFsaWRhdGlvbiBlcnJvcnMsIENSVUQgb3BlcmF0aW9ucyxcbiAgICogb3Igb3RoZXIgYnVzaW5lc3MgbG9naWMgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7SW9uQWNjb3JkaW9uR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYWNjb3JkaW9uQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGFjY29yZGlvbkNvbXBvbmVudCE6IElvbkFjY29yZGlvbkdyb3VwO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBuYW1lIG9yIHRpdGxlIG9mIHRoZSBmaWVsZHNldCBzZWN0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBsZWdlbmQgb3IgaGVhZGVyIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBhY2NvcmRpb24gaGVhZGVyLiBUaGlzIHRleHRcbiAgICogcHJvdmlkZXMgYSBjbGVhciBsYWJlbCBmb3IgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24sIGhlbHBpbmcgdXNlcnMgdW5kZXJzdGFuZCB3aGF0IGNvbnRlbnRcbiAgICogaXMgY29udGFpbmVkIHdpdGhpbi4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIHByb21pbmVudGx5IGFuZCBzZXJ2ZXMgYXMgdGhlIGNsaWNrYWJsZSBhcmVhXG4gICAqIGZvciBleHBhbmRpbmcvY29sbGFwc2luZyB0aGUgZmllbGRzZXQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBuYW1lOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGlsZE9mOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkLlxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQgYmVpbmcgZGlzcGxheWVkIG9yIG1hbmlwdWxhdGVkLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByaW1hcnkga2V5IGZvciBvcGVyYXRpb25zIG9uIHNwZWNpZmljIHJlY29yZHMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcGFnZSE6IG51bWJlcjtcblxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB1aWQ6IHN0cmluZyA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdHlwZSBkZWZpbml0aW9ucyBmb3Igc3BlY2lhbGl6ZWQgZmllbGRzZXQgYmVoYXZpb3IuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgY3VzdG9tIGRhdGEgdHlwZXMgb3IgdmFsaWRhdGlvbiBydWxlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgZmllbGRzZXQuXG4gICAqIENhbiBiZSBhIHNpbmdsZSB0eXBlIHN0cmluZyBvciBhcnJheSBvZiB0eXBlcyB0aGF0IGRldGVybWluZSBob3cgdGhlIGZpZWxkc2V0IGhhbmRsZXNcbiAgICogZGF0YSB2YWxpZGF0aW9uLCBmb3JtYXR0aW5nLCBhbmQgZGlzcGxheSBiZWhhdmlvciBmb3Igc3BlY2lhbGl6ZWQgdXNlIGNhc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY3VzdG9tVHlwZXMhOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IENSVUQgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvbXBvbmVudCdzIGluaXRpYWwgYmVoYXZpb3IgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbi5cbiAgICogVGhpcyBpbnB1dCBpcyBjcnVjaWFsIGZvciBhdXRvLXN0YXRlIG1hbmFnZW1lbnQ6IFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zIGF1dG9tYXRpY2FsbHlcbiAgICogb3BlbiB0aGUgZmllbGRzZXQgdG8gc2hvdyBjb250ZW50LCB3aGlsZSBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zIGtlZXAgaXQgY2xvc2VkXG4gICAqIGluaXRpYWxseS4gVGhpcyBwcm92aWRlcyBhbiBpbnR1aXRpdmUgdXNlciBleHBlcmllbmNlIGFsaWduZWQgd2l0aCBvcGVyYXRpb24gc2VtYW50aWNzLlxuICAgKlxuICAgKiBAdHlwZSB7T3BlcmF0aW9uS2V5c31cbiAgICogQGRlZmF1bHQgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgQ1JVRCBvcGVyYXRpb24gdHlwZSBmb3IgdGhlIGN1cnJlbnQgZmllbGRzZXQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgPSBPcGVyYXRpb25LZXlzLlJFQUQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFjdGl2ZSBmb3JtIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYWxsIGZvcm0gY29udHJvbHMgd2l0aGluIHRoaXMgZmllbGRzZXQuXG4gICAqIFVzZWQgZm9yIGZvcm0gdmFsaWRhdGlvbiwgdmFsdWUgbWFuYWdlbWVudCwgYW5kIGludGVncmF0aW9uIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6ICBGb3JtQXJyYXk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IHRpdGxlIHRleHQgZm9yIHRoZSBmaWVsZHNldCBjb250ZW50LlxuICAgKiBAc3VtbWFyeSBEaXNwbGF5IHRpdGxlIHVzZWQgZm9yIGZpZWxkc2V0IGlkZW50aWZpY2F0aW9uIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi5cbiAgICogUHJvdmlkZXMgc2VtYW50aWMgbWVhbmluZyB0byB0aGUgZ3JvdXBlZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlY29uZGFyeSBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBwcm92aWRlcyBjb250ZXh0IG9yIGluc3RydWN0aW9uc1xuICAgKiByZWxhdGVkIHRvIHRoZSBmaWVsZHNldCBjb250ZW50IGFuZCBwdXJwb3NlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRlc2NyaXB0aW9uITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRm9ybSB0YXJnZXQgYXR0cmlidXRlIGZvciBuZXN0ZWQgZm9ybSBzdWJtaXNzaW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3BvbnNlIGFmdGVyIHN1Ym1pdHRpbmcgZm9ybXMgY29udGFpbmVkIHdpdGhpblxuICAgKiB0aGUgZmllbGRzZXQuIFRoaXMgYXR0cmlidXRlIG1pcnJvcnMgdGhlIEhUTUwgZm9ybSB0YXJnZXQgYmVoYXZpb3IsIGFsbG93aW5nIGNvbnRyb2wgb3ZlclxuICAgKiB3aGV0aGVyIGZvcm0gc3VibWlzc2lvbnMgb3BlbiBpbiB0aGUgc2FtZSB3aW5kb3csIG5ldyB3aW5kb3csIG9yIHNwZWNpZmljIGZyYW1lLiBVc2VmdWxcbiAgICogZm9yIGNvbXBsZXggZm9ybSB3b3JrZmxvd3MgYW5kIG11bHRpLXN0ZXAgcHJvY2Vzc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7SFRNTEZvcm1UYXJnZXR9XG4gICAqIEBkZWZhdWx0ICdfc2VsZidcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0YXJnZXQ6IEhUTUxGb3JtVGFyZ2V0ID0gJ19zZWxmJztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBtdWx0aXBsZSBpdGVtIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgZmllbGRzZXQgc3VwcG9ydHMgYWRkaW5nIG11bHRpcGxlIHZhbHVlcy5cbiAgICogV2hlbiB0cnVlLCBkaXNwbGF5cyBhIHJlb3JkZXJhYmxlIGxpc3Qgb2YgaXRlbXMgd2l0aCBhZGQvcmVtb3ZlIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiByYXcgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBhY3R1YWwgZGF0YSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBmaWVsZHNldCdzIGRhdGEgc3RhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIGZpZWxkc2V0IGFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEEgcmVjb3JkIG9mIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGtleWVkIGJ5IGV2ZW50IG5hbWVzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZFxuICAgKiB3aXRoaW4gdGhlIGZpZWxkc2V0LiBUaGVzZSBoYW5kbGVycyBwcm92aWRlIGV4dGVuc2liaWxpdHkgZm9yIGN1c3RvbSBidXNpbmVzcyBsb2dpY1xuICAgKiBhbmQgY2FuIGJlIGludm9rZWQgZm9yIHZhcmlvdXMgZmllbGRzZXQgb3BlcmF0aW9ucyBhbmQgdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtIYW5kbGVyTGlrZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBoYW5kbGVycyE6IEhhbmRsZXJMaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgZm9ybWF0dGVkIGl0ZW1zIGZvciBVSSBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB0aGUgcHJvY2Vzc2VkIGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5IGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoZXNlIGl0ZW1zIGFyZSBtYXBwZWQgZnJvbSB0aGUgcmF3IHZhbHVlcyB1c2luZyB0aGUgbWFwcGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXM6IElGaWVsZFNldEl0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gZm9yIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBIb2xkcyB0aGUgaXRlbSBiZWluZyBlZGl0ZWQgd2hlbiBpbiB1cGRhdGUgbW9kZS4gVXNlZCB0byB0cmFja1xuICAgKiB3aGljaCBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHRoZSBjb3JyZWN0IGl0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHVwZGF0aW5nSXRlbSE6IElGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWQ7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGFjY29yZGlvbiAoZXhwYW5kZWQgb3IgY29sbGFwc2VkKS5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGFjY29yZGlvbiBpcyBjdXJyZW50bHkgb3BlbiBvciBjbG9zZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBtYW5hZ2VkIGJhc2VkIG9uIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBpbml0aWFsIG9wZXJhdGlvbiBzdGF0ZS5cbiAgICogSXQgc2VydmVzIGFzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgY29tcG9uZW50J3MgdmlzaWJpbGl0eSBzdGF0ZSBhbmQgaXMgdXNlZFxuICAgKiB0byBjb29yZGluYXRlIGJldHdlZW4gdXNlciBhY3Rpb25zIGFuZCBwcm9ncmFtbWF0aWMgc3RhdGUgY2hhbmdlcy4gVGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHlcbiAgICogc2V0IGJhc2VkIG9uIENSVUQgb3BlcmF0aW9ucyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHVwZGF0ZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGRzZXQgY29udGFpbnMgcmVxdWlyZWQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IEJvb2xlYW4gZmxhZyB0aGF0IHNpZ25hbHMgdGhlIHByZXNlbmNlIG9mIG1hbmRhdG9yeSBpbnB1dCBmaWVsZHMgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgQ29sbGFwc2FibGVEaXJlY3RpdmUgd2hlbiByZXF1aXJlZCBmaWVsZHMgYXJlIGRldGVjdGVkLFxuICAgKiBhbmQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc3BlY2lhbCBzdHlsaW5nLCB2YWxpZGF0aW9uIGxvZ2ljLCBvciBVSSBpbmRpY2F0b3JzIHRvIGhpZ2hsaWdodFxuICAgKiBmaWVsZHNldHMgdGhhdCBjb250YWluIG1hbmRhdG9yeSBpbmZvcm1hdGlvbi4gSXQgaGVscHMgd2l0aCBmb3JtIHZhbGlkYXRpb24gZmVlZGJhY2sgYW5kXG4gICAqIHVzZXIgZXhwZXJpZW5jZSBieSBtYWtpbmcgcmVxdWlyZWQgc2VjdGlvbnMgbW9yZSBwcm9taW5lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIGlmIGFueSBmb3JtIGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0IGhhdmUgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBjb250cm9sIGFjY29yZGlvbiBiZWhhdmlvciB3aGVuIGVycm9ycyBhcmUgcHJlc2VudCwgcHJldmVudGluZ1xuICAgKiB1c2VycyBmcm9tIGNvbGxhcHNpbmcgdGhlIGFjY29yZGlvbiB3aGVuIHRoZXkgbmVlZCB0byBzZWUgYW5kIGFkZHJlc3MgdmFsaWRhdGlvbiBpc3N1ZXMuXG4gICAqIEl0J3MgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gdmFsaWRhdGlvbiBlcnJvciBldmVudHMgYXJlIHJlY2VpdmVkIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhc1ZhbGlkYXRpb25FcnJvcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZSBmb3IgZHVwbGljYXRlIHZhbHVlcy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFkZCBhIGR1cGxpY2F0ZSB2YWx1ZVxuICAgKiB0byB0aGUgZmllbGRzZXQuIFVzZWQgdG8gZGlzcGxheSB1bmlxdWVuZXNzIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNVbmlxdWVFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIENSVUQgb3BlcmF0aW9uIGNvbnN0YW50cyBmb3IgdGVtcGxhdGUgdXNhZ2UuXG4gICAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIE9wZXJhdGlvbktleXMgZW51bSB0byB0aGUgY29tcG9uZW50IHRlbXBsYXRlLCBlbmFibGluZyBjb25kaXRpb25hbFxuICAgKiByZW5kZXJpbmcgYW5kIGJlaGF2aW9yIGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlcy4gVGhpcyBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydHkgZW5zdXJlc1xuICAgKiB0aGF0IHRlbXBsYXRlIGxvZ2ljIGNhbiBhY2Nlc3Mgb3BlcmF0aW9uIGNvbnN0YW50cyB3aGlsZSBtYWludGFpbmluZyBlbmNhcHN1bGF0aW9uIGFuZFxuICAgKiBwcmV2ZW50aW5nIGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIG9mIHRoZSBlbnVtIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge0NydWRPcGVyYXRpb25zfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzOiBDcnVkT3BlcmF0aW9ucyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNlcnZpY2UuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBtYW51YWwgY29udHJvbCBvdmVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLlxuICAgKiBUaGlzIGlzIGVzc2VudGlhbCBmb3IgZW5zdXJpbmcgdGhhdCBwcm9ncmFtbWF0aWMgRE9NIGNoYW5nZXMgKGxpa2Ugc2V0dGluZyBhY2NvcmRpb25cbiAgICogYXR0cmlidXRlcykgYXJlIHByb3Blcmx5IHJlZmxlY3RlZCBpbiB0aGUgY29tcG9uZW50J3Mgc3RhdGUgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGVcbiAgICogdmlldyB1cGRhdGVzIHdoZW4gbW9kaWZpY2F0aW9ucyBvY2N1ciBvdXRzaWRlIHRoZSBub3JtYWwgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIGZsb3cuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIFJlbmRlcmVyMiBzZXJ2aWNlIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBhIHNhZmUsIHBsYXRmb3JtLWFnbm9zdGljIHdheSB0byBtYW5pcHVsYXRlIERPTSBlbGVtZW50cy5cbiAgICogVGhpcyBzZXJ2aWNlIGVuc3VyZXMgcHJvcGVyIGhhbmRsaW5nIG9mIERPTSBvcGVyYXRpb25zIGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zIGFuZCBlbnZpcm9ubWVudHMsXG4gICAqIGluY2x1ZGluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIHdlYiB3b3JrZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVuZGVyZXIyfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRpb24gc2VydmljZSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0cmFuc2xhdGlvbiBjYXBhYmlsaXRpZXMgZm9yIFVJIHRleHQuXG4gICAqIFVzZWQgdG8gdHJhbnNsYXRlIGJ1dHRvbiBsYWJlbHMgYW5kIHZhbGlkYXRpb24gbWVzc2FnZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7VHJhbnNsYXRlU2VydmljZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2NhbGl6ZWQgbGFiZWwgdGV4dCBmb3IgYWN0aW9uIGJ1dHRvbnMuXG4gICAqIEBzdW1tYXJ5IER5bmFtaWMgYnV0dG9uIGxhYmVsIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbW9kZS5cbiAgICogU2hvd3MgXCJBZGRcIiBmb3IgY3JlYXRlIG9wZXJhdGlvbnMgYW5kIFwiVXBkYXRlXCIgZm9yIGVkaXQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBidXR0b25MYWJlbCE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9jYWxpemVkIGxhYmVsIHRleHQgZm9yIGFjdGlvbiBidXR0b25zLlxuICAgKiBAc3VtbWFyeSBEeW5hbWljIGJ1dHRvbiBsYWJlbCB0aGF0IGNoYW5nZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuXG4gICAqIFNob3dzIFwiQ2FuY2VsXCIgZm9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgYnV0dG9uQ2FuY2VsTGFiZWwhOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBmaWVsZHNldCB3aXRoIGljb25zIGFuZCBjb21wb25lbnQgbmFtZS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBOZ3hCYXNlQ29tcG9uZW50IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGFuZFxuICAgKiByZXF1aXJlZCBJb25pYyBpY29ucyAoYWxlcnRDaXJjbGVPdXRsaW5lIGZvciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgY3JlYXRlT3V0bGluZSBmb3IgYWRkIGFjdGlvbnMpLlxuICAgKiBTZXRzIHVwIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50IHN0cnVjdHVyZSBhbmQgaWNvbiByZWdpc3RyeS5cbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignRmllbGRzZXRDb21wb25lbnQnKTtcbiAgICBhZGRJY29ucyh7IGFsZXJ0Q2lyY2xlT3V0bGluZSwgY3JlYXRlT3V0bGluZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYnkgc2V0dGluZyB1cCByZXBvc2l0b3J5IHJlbGF0aW9uc2hpcHMgaWYgYSBtb2RlbCBleGlzdHMsXG4gICAqIGFuZCBjb25maWd1cmVzIHRoZSBpbml0aWFsIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIGFkZCBhY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHByb3BlciBzZXR1cCBvZiB0cmFuc2xhdGlvbiBzZXJ2aWNlcyBhbmQgY29tcG9uZW50IHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm1vZGVsKVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMuYnV0dG9uQ2FuY2VsTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuY2FuY2VsJyk7XG4gIH1cblxuICAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IHN0YXRlIGFmdGVyIHZpZXcgYW5kIGNoaWxkIGNvbXBvbmVudHMgYXJlIHJlbmRlcmVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIGxpZmVjeWNsZSBob29rIGltcGxlbWVudHMgaW50ZWxsaWdlbnQgYXV0by1zdGF0ZSBtYW5hZ2VtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50XG4gICAqIENSVUQgb3BlcmF0aW9uLiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIHRoZSBmaWVsZHNldCBhdXRvbWF0aWNhbGx5IG9wZW5zIHRvIHByb3ZpZGVcbiAgICogaW1tZWRpYXRlIGFjY2VzcyB0byBpbmZvcm1hdGlvbiwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZCB0byBtYWludGFpblxuICAgKiBhIGNsZWFuIGluaXRpYWwgaW50ZXJmYWNlLiBUaGUgbWV0aG9kIGRpcmVjdGx5IG1hbmlwdWxhdGVzIHRoZSBET00gdG8gZW5zdXJlIHByb3BlciBhY2NvcmRpb25cbiAgICogc3luY2hyb25pemF0aW9uIGFuZCB0cmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJlZmxlY3QgdGhlIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBGaWVsZHNldENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDaGFuZ2VEZXRlY3RvclxuICAgKlxuICAgKiAgIEEtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICAgKiAgIGFsdCBvcGVyYXRpb24gaXMgUkVBRCBvciBERUxFVEVcbiAgICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICAgKiAgICAgRi0+PkQ6IFF1ZXJ5IGlvbi1hY2NvcmRpb24tZ3JvdXAgZWxlbWVudFxuICAgKiAgICAgYWx0IGFjY29yZGlvbiBlbGVtZW50IGV4aXN0c1xuICAgKiAgICAgICBGLT4+RDogU2V0IHZhbHVlIGF0dHJpYnV0ZSB0byAnb3BlbidcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5DOiBkZXRlY3RDaGFuZ2VzKClcbiAgICogICBDLT4+RjogVXBkYXRlIHZpZXcgd2l0aCBuZXcgc3RhdGVcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5SRUFEIHx8IHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSkge1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgLy8gaGlkZGVuIHJlbW92ZSBidXR0b25cbiAgICAgIGNvbnN0IGFjY29yZGlvbkVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpb24tYWNjb3JkaW9uLWdyb3VwJyk7XG4gICAgICBpZih0aGlzLmFjY29yZGlvbkNvbXBvbmVudClcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYWNjb3JkaW9uRWxlbWVudCwgJ3ZhbHVlJywgJ29wZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5jb21wb25lbnQ/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JlcXVpcmVkXScpO1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gaW5wdXRzLmxlbmd0aCA+IDA7XG4gICAgICBpZih0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gICAgICAgIHRoaXMuaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHJlbW92YWwgb2YgdGhlIGZpZWxkc2V0IHdpdGggc2xpZGUgYW5pbWF0aW9uLlxuICAgKiBAc3VtbWFyeSBJbml0aWF0ZXMgdGhlIHJlbW92YWwgcHJvY2VzcyBmb3IgdGhlIGZpZWxkc2V0IHdpdGggYSBzbW9vdGggc2xpZGUtdXAgYW5pbWF0aW9uLlxuICAgKiBUaGUgbWV0aG9kIGFwcGxpZXMgQ1NTIGNsYXNzZXMgZm9yIHRoZSBzbGlkZSBhbmltYXRpb24gYW5kIHRoZW4gc2FmZWx5IHJlbW92ZXMgdGhlXG4gICAqIGVsZW1lbnQgZnJvbSB0aGUgRE9NIHVzaW5nIFJlbmRlcmVyMi4gVGhpcyBwcm92aWRlcyBhIHBvbGlzaGVkIHVzZXIgZXhwZXJpZW5jZVxuICAgKiB3aGVuIHJlbW92aW5nIGZpZWxkc2V0IGluc3RhbmNlcyBmcm9tIGR5bmFtaWMgZm9ybXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gRE9NIGV2ZW50IGZyb20gdGhlIHJlbW92ZSBidXR0b24gY2xpY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlQ29tcG9uZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGNmLWFuaW1hdGlvbicsICdkY2YtYW5pbWF0aW9uLXNsaWRlLXRvcC1tZWRpdW0nLCAnZGNmLWFuaW1hdGlvbi1yZXZlcnNlJywgJ2RjZi1hbmltYXRpb24tZmFzdCcpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gVXNlIFJlbmRlcmVyMiB0byBzYWZlbHkgcmVtb3ZlIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICBpZiAocGFyZW50KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfSwgMTUwKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNyZWF0aW5nIG5ldyBpdGVtcyBvciB0cmlnZ2VyaW5nIGdyb3VwIGFkZGl0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZvcm0gdmFsaWRhdGlvbiBldmVudHMgZm9yIGl0ZW0gY3JlYXRpb24gb3IgZW1pdHMgZXZlbnRzIHRvIHRyaWdnZXJcbiAgICogdGhlIGFkZGl0aW9uIG9mIG5ldyBmaWVsZHNldCBncm91cHMuIFdoZW4gY2FsbGVkIHdpdGggdmFsaWRhdGlvbiBldmVudCBkYXRhLCBpdCB2YWxpZGF0ZXNcbiAgICogdW5pcXVlbmVzcyBhbmQgYWRkcyB0aGUgaXRlbSB0byB0aGUgZmllbGRzZXQuIFdoZW4gY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycywgaXQgdHJpZ2dlcnNcbiAgICogYSBncm91cCBhZGRpdGlvbiBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudHMgdG8gaGFuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD59IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGNvbnRhaW5pbmcgZm9ybSBkYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDYWxsZWQgZnJvbSBmb3JtIHZhbGlkYXRpb25cbiAgICogaGFuZGxlQ3JlYXRlSXRlbSh2YWxpZGF0aW9uRXZlbnQpO1xuICAgKlxuICAgKiAvLyBDYWxsZWQgdG8gdHJpZ2dlciBncm91cCBhZGRpdGlvblxuICAgKiBoYW5kbGVDcmVhdGVJdGVtKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlSXRlbShldmVudD86IEN1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCAmJiBldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtmb3JtR3JvdXAsIHZhbHVlLCBpc1ZhbGlkfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gZm9ybUdyb3VwIGFzIEZvcm1BcnJheTtcbiAgICAgIGlmKCF0aGlzLm1hcHBlcilcbiAgICAgICAgdGhpcy5tYXBwZXIgPSB0aGlzLmdldE1hcHBlcih2YWx1ZSBhcyBLZXlWYWx1ZSk7XG4gICAgICBpZihpc1ZhbGlkICl7XG4gICAgICAgICAgdGhpcy5pc1VuaXF1ZUVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuYWRkJyk7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICB0aGlzLmlzVW5pcXVlRXJyb3IgPSAodmFsdWUgYXMgS2V5VmFsdWUpPy5bdGhpcy5wa10gfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfQUREX0dST1VQLCB7XG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgaW5kZXg6IHRoaXMudXBkYXRpbmdJdGVtID8gdGhpcy51cGRhdGluZ0l0ZW0uaW5kZXggOiB0aGlzLnZhbHVlPy5sZW5ndGgsXG4gICAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgICBvcGVyYXRpb246ICF0aGlzLnVwZGF0aW5nSXRlbSA/IE9wZXJhdGlvbktleXMuQ1JFQVRFIDogT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gdXBkYXRlIG9wZXJhdGlvbnMgd2l0aCBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IExvY2F0ZXMgYW4gaXRlbSBpbiB0aGUgZm9ybSBhcnJheSBmb3IgZWRpdGluZyBhbmQgcHJlcGFyZXMgdGhlIGNvbXBvbmVudFxuICAgKiBmb3IgdXBkYXRlIG1vZGUuIFVwZGF0ZXMgdGhlIGJ1dHRvbiBsYWJlbCB0byByZWZsZWN0IHRoZSBlZGl0IHN0YXRlIGFuZCBzdG9yZXNcbiAgICogdGhlIGl0ZW0gYmVpbmcgdXBkYXRlZC4gVHJpZ2dlcnMgYSB3aW5kb3cgZXZlbnQgdG8gbm90aWZ5IHBhcmVudCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgLSBUaGUgaWRlbnRpZmllciB2YWx1ZSBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGFycmF5IGluZGV4IHBvc2l0aW9uIG9mIHRoZSBpdGVtXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVVwZGF0ZUl0ZW0odmFsdWU6IHN0cmluZyB8IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gYCR7Y29udHJvbC5nZXQodGhpcy5wayk/LnZhbHVlfWAudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5TcGFjZXMoYCR7dmFsdWV9YCwgdHJ1ZSkpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmKGl0ZW0pIHtcbiAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcudXBkYXRlJyk7XG4gICAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0udmFsdWUgfHwge30sIHtpbmRleH0pO1xuICAgICAgd2luZG93RXZlbnRFbWl0dGVyKEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX1VQREFURV9HUk9VUCwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FuY2VscyB0aGUgdXBkYXRlIG1vZGUgYW5kIHJlc2V0cyB0aGUgVUkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IEV4aXRzIHRoZSB1cGRhdGUgbW9kZSBieSByZXNldHRpbmcgdGhlIGJ1dHRvbiBsYWJlbCBhbmQgY2xlYXJpbmcgdGhlIHVwZGF0aW5nIGl0ZW0sXG4gICAqIHJlc3RvcmluZyB0aGUgY29tcG9uZW50IHRvIGl0cyBkZWZhdWx0IHN0YXRlIGZvciBhZGRpbmcgbmV3IGl0ZW1zLiBOb3RpZmllcyBwYXJlbnQgY29tcG9uZW50c1xuICAgKiB0aGF0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMudXBkYXRpbmdJdGVtID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgaW5kZXg6IHRoaXMudmFsdWU/Lmxlbmd0aFxuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgaXRlbSByZW1vdmFsIG9wZXJhdGlvbnMgd2l0aCBmb3JtIGFycmF5IG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBpdGVtIHJlbW92YWwgYnkgZWl0aGVyIGhhbmRsaW5nIHZhbGlkYXRpb24gZXZlbnRzIG9yIHJlbW92aW5nIHNwZWNpZmljXG4gICAqIGl0ZW1zIGZyb20gdGhlIGZvcm0gYXJyYXkuIFdoZW4gY2FsbGVkIHdpdGggYSB2YWxpZGF0aW9uIGV2ZW50LCBpdCB0cmlnZ2VycyB2YWx1ZSB1cGRhdGVzLlxuICAgKiBXaGVuIGNhbGxlZCB3aXRoIGFuIGlkZW50aWZpZXIsIGl0IGxvY2F0ZXMgYW5kIHJlbW92ZXMgdGhlIG1hdGNoaW5nIGl0ZW0gZnJvbSB0aGUgZm9ybSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGZvciBmb3JtIHVwZGF0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlSXRlbSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7XG4gICAgY29uc3QgYXJyYXlMZW5ndGggPSBmb3JtQXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXlMZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBncm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGNsZWFuU3BhY2VzKGdyb3VwLmdldCh0aGlzLnBrKT8udmFsdWUpID09PSBjbGVhblNwYWNlcyh2YWx1ZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9SRU1PVkVfR1JPVVAsIHtcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgZm9ybUdyb3VwOiBncm91cFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZW9yZGVyaW5nIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGRzZXQgbGlzdC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGRyYWctYW5kLWRyb3AgcmVvcmRlciBldmVudHMgZnJvbSB0aGUgaW9uLXJlb3JkZXItZ3JvdXAgY29tcG9uZW50LlxuICAgKiBVcGRhdGVzIGJvdGggdGhlIGRpc3BsYXkgaXRlbXMgYXJyYXkgYW5kIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGFycmF5IHRvIG1haW50YWluXG4gICAqIGNvbnNpc3RlbmN5IGJldHdlZW4gVUkgc3RhdGUgYW5kIGRhdGEgc3RhdGUuIFByZXNlcnZlcyBpdGVtIGluZGljZXMgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJdGVtUmVvcmRlckV2ZW50RGV0YWlsPn0gZXZlbnQgLSBJb25pYyByZW9yZGVyIGV2ZW50IGNvbnRhaW5pbmcgc291cmNlIGFuZCB0YXJnZXQgaW5kaWNlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGh0bWxcbiAgICogPGlvbi1yZW9yZGVyLWdyb3VwIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVyKCRldmVudClcIj5cbiAgICogICA8IS0tIFJlb3JkZXJhYmxlIGl0ZW1zIC0tPlxuICAgKiA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgKiBgYGBcbiAgICovXG4gIGhhbmRsZVJlb3JkZXJJdGVtcyhldmVudDogQ3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD4pOiB2b2lkIHtcbiAgIGNvbnN0IGZyb21JbmRleCA9IGV2ZW50LmRldGFpbC5mcm9tO1xuICAgIGNvbnN0IHRvSW5kZXggPSBldmVudC5kZXRhaWwudG87XG5cbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXTsgLy8gc3VhIGVzdHJ1dHVyYSB2aXN1YWxcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7IC8vIEZvcm1BcnJheSByZWF0aXZvXG5cbiAgICBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAvLyBSZW9yZGVuYXIgb3MgZGFkb3MgdmlzdWFpc1xuICAgICAgY29uc3QgaXRlbVRvTW92ZSA9IGl0ZW1zLnNwbGljZShmcm9tSW5kZXgsIDEpWzBdO1xuICAgICAgaXRlbXMuc3BsaWNlKHRvSW5kZXgsIDAsIGl0ZW1Ub01vdmUpO1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IGl0ZW1bJ2luZGV4J10gPSBpbmRleCArIDEpO1xuXG4gICAgICAvLyBSZW9yZGVuYXIgb3MgY29udHJvbGVzIGRvIEZvcm1BcnJheVxuICAgICAgY29uc3QgY29udHJvbFRvTW92ZSA9IGZvcm1BcnJheS5hdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGZyb21JbmRleCk7XG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KHRvSW5kZXgsIGNvbnRyb2xUb01vdmUpO1xuICAgIH1cbiAgICAvLyBGaW5hbGl6YSBhIG9wZXJhw6fDo28gZGUgcmVvcmRlciBkbyBJb25pY1xuICAgIGV2ZW50LmRldGFpbC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGFjY29yZGlvbiBzdGF0ZSBjaGFuZ2UgZXZlbnRzIGZyb20gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBDdXN0b21FdmVudCBvYmplY3RzIHRyaWdnZXJlZCB3aGVuIHVzZXJzIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgYWNjb3JkaW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgbmV3IHN0YXRlIGZyb20gdGhlIGV2ZW50IGRldGFpbHMgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGludGVybmFsIHN0YXRlIGFjY29yZGluZ2x5LiBJdCBzcGVjaWZpY2FsbHkgbGlzdGVucyBmb3IgSU9OLUFDQ09SRElPTi1HUk9VUCBldmVudHMgdG9cbiAgICogZW5zdXJlIHByb3BlciBldmVudCBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgcHJldmVudCBoYW5kbGluZyBvZiB1bnJlbGF0ZWQgZXZlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgY29udGFpbmluZyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uLUFjY29yZGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogICBVLT4+STogQ2xpY2sgYWNjb3JkaW9uIGhlYWRlclxuICAgKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoQ3VzdG9tRXZlbnQpXG4gICAqICAgRi0+PkY6IEV4dHJhY3QgdGFyZ2V0IGFuZCBkZXRhaWwgZnJvbSBldmVudFxuICAgKiAgIEYtPj5GOiBWYWxpZGF0ZSB0YXJnZXQgaXMgSU9OLUFDQ09SRElPTi1HUk9VUFxuICAgKiAgIGFsdCB2YWxpZCB0YXJnZXRcbiAgICogICAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuID0gISF2YWx1ZVxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5JOiBSZWZsZWN0IHVwZGF0ZWQgc3RhdGVcbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gdG9nZ2xlIGZ1bmN0aW9uYWxpdHkgd2l0aCB2YWxpZGF0aW9uIGVycm9yIGNvbnNpZGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IE1hbmFnZXMgdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIHdoaWxlIHJlc3BlY3RpbmcgdmFsaWRhdGlvbiBlcnJvciBzdGF0ZXMuXG4gICAqIFdoZW4gdmFsaWRhdGlvbiBlcnJvcnMgYXJlIHByZXNlbnQsIHRoZSBhY2NvcmRpb24gY2Fubm90IGJlIGNvbGxhcHNlZCB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZVxuICAgKiBhbmQgYWRkcmVzcyB0aGUgZXJyb3JzLiBXaGVuIG5vIGVycm9ycyBleGlzdCwgdXNlcnMgY2FuIGZyZWVseSB0b2dnbGUgdGhlIGFjY29yZGlvbiBzdGF0ZS5cbiAgICogVGhpcyBtZXRob2QgYWxzbyBzdG9wcyBldmVudCBwcm9wYWdhdGlvbiB0byBwcmV2ZW50IHVud2FudGVkIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gW2V2ZW50XSAtIE9wdGlvbmFsIGV2ZW50IG9iamVjdCBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKGV2ZW50PzogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBpZihldmVudClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGlmKCF0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gdGhpcy5pc09wZW4gPyB1bmRlZmluZWQgOiAnb3Blbic7XG4gICAgICB0aGlzLmlzT3BlbiA9ICEhdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3IgZXZlbnRzIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBkaXNwYXRjaGVkIGJ5IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQuXG4gICAqIFdoZW4gZXJyb3JzIGFyZSBkZXRlY3RlZCwgdGhlIGFjY29yZGlvbiBpcyBmb3JjZWQgb3BlbiBhbmQgcHJldmVudGVkIGZyb20gY29sbGFwc2luZ1xuICAgKiB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4gVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29tcG9uZW50J3NcbiAgICogZXJyb3Igc3RhdGUgYW5kIGFjY29yZGlvbiB2aXNpYmlsaXR5IGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIEN1c3RvbSBldmVudCBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3IgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVWYWxpZGF0aW9uRXJyb3IoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qge2hhc0Vycm9yc30gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy5pc09wZW4gPSB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSBoYXNFcnJvcnM7XG4gICAgaWYoaGFzRXJyb3JzKVxuICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGFuZCBzdG9yZXMgYSBuZXcgb3IgdXBkYXRlZCB2YWx1ZSBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zIGZvciBmaWVsZHNldCBpdGVtcy4gUGFyc2VzIGFuZCBjbGVhbnNcbiAgICogdGhlIGlucHV0IHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgdXBkYXRpbmcgc3RhdGUsIGFuZCBlaXRoZXJcbiAgICogYWRkcyBhIG5ldyBpdGVtIG9yIHVwZGF0ZXMgYW4gZXhpc3Rpbmcgb25lLiBNYWludGFpbnMgZGF0YSBpbnRlZ3JpdHkgYW5kIFVJIGNvbnNpc3RlbmN5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHNldFZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5KS5jb250cm9scy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy52YWx1ZVxuICAgIC5maWx0ZXIodiA9PiB2W3RoaXMucGtdICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgodiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW1NYXBwZXIoT2JqZWN0LmFzc2lnbih7fSwgdiksIHRoaXMubWFwcGVyKSxcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMVxuICAgICAgfSBhcyBJRmllbGRTZXRJdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0Q29udGFpbmVycyA9IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRjZi1pbnB1dC1pdGVtJyk7XG4gICAgaW5wdXRDb250YWluZXJzLmZvckVhY2goKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCBpb24taW5wdXQsIGlvbi10ZXh0YXJlYSwgdGV4dGFyZWEnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmKGlucHV0KVxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH0pXG4gICAgdGhpcy51cGRhdGluZ0l0ZW0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgZmllbGQgbWFwcGluZyBiYXNlZCBvbiB0aGUgdmFsdWUgc3RydWN0dXJlLlxuICAgKiBAc3VtbWFyeSBBbmFseXplcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBwcmltYXJ5IGtleVxuICAgKiBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGZpZWxkIG1hcHBpbmdzIGZvciBkaXNwbGF5IHB1cnBvc2VzLiBTZXRzIHVwIHRoZSBtYXBwZXIgb2JqZWN0XG4gICAqIHdpdGggdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW5kZXggZmllbGRzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IHZhbHVlIC0gU2FtcGxlIHZhbHVlIG9iamVjdCB1c2VkIHRvIGRldGVybWluZSBmaWVsZCBtYXBwaW5nc1xuICAgKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBjb25maWd1cmVkIG1hcHBlciBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGdldE1hcHBlcih2YWx1ZTogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gICAgaWYoIXRoaXMucGspXG4gICAgICB0aGlzLnBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgIGlmKCFPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoKVxuICAgICAgdGhpcy5tYXBwZXJbJ3RpdGxlJ10gPSB0aGlzLnBrO1xuICAgIHRoaXMubWFwcGVyWydpbmRleCddID0gXCJpbmRleFwiO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPj0gMiB8fCBPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoID09PSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmKCF0aGlzLm1hcHBlclsndGl0bGUnXSkge1xuICAgICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwcGVyWydkZXNjcmlwdGlvbiddID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXBwZXI7XG4gIH1cbn1cbiIsIlxuXG48ZmllbGRzZXRcbiAgKGZpZWxkc2V0QWRkR3JvdXBFdmVudCk9XCJoYW5kbGVDcmVhdGVJdGVtKCRldmVudClcIlxuICAoZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KT1cImhhbmRsZVJlbW92ZUl0ZW0odW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgW2NsYXNzXT1cIidkY2YtZmllbGRzZXQgJyArIG9wZXJhdGlvblwiXG4gICNjb21wb25lbnQ+XG4gIDxpb24tYWNjb3JkaW9uLWdyb3VwIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiIFtjbGFzcy5oYXNWYWxpZGF0aW9uRXJyb3JzXT1cImhhc1ZhbGlkYXRpb25FcnJvcnNcIiAodmFsaWRhdGlvbkVycm9yRXZlbnQpPVwiaGFuZGxlVmFsaWRhdGlvbkVycm9yKCRldmVudClcIiAjYWNjb3JkaW9uQ29tcG9uZW50PlxuICAgIDxpb24tYWNjb3JkaW9uIHZhbHVlPVwib3BlblwiPlxuICAgICAgPGlvbi1pdGVtIHNsb3Q9XCJoZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZSBkY2Ytd2lkdGgtMS0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+e3sgbmFtZSB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZighaXNSZXF1aXJlZCAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWF1dG8gZGNmLWRlbGV0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlQ29tcG9uZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiZGNmLWZpZWxkcy1saXN0XCI+XG4gICAgICAgICAgICA8aW9uLXJlb3JkZXItZ3JvdXAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXAucGFyZW50XCIgW2Rpc2FibGVkXT1cInVwZGF0aW5nSXRlbVwiIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVySXRlbXMoJGFueSgkZXZlbnQpKVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIDxpb24taXRlbSBbY2xhc3Mubm90LXVuaXF1ZV09XCJpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yXCIgIFtjbGFzcy51cGRhdGluZ109XCJ1cGRhdGluZ0l0ZW0/Lltwa10gPT09IGl0ZW0udGl0bGVcIiBsaW5lcz1cImZ1bGxcIiBbYnV0dG9uXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbXM/Lmxlbmd0aCA+IDEgJiYgIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLXJlb3JkZXIgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzd2FwLXZlcnRpY2FsLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1yZW9yZGVyPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZGNmLXJlb3JkZXItZGlzYWJsZWRcIiBzaXplPVwic21hbGxcIiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCIgZGlzYWJsZWQ+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtjb2xvcl09XCIoaXRlbS50aXRsZSA9PT0gaXNVbmlxdWVFcnJvciAmJiAhdXBkYXRpbmdJdGVtPy5bcGtdID09PSBpdGVtLnRpdGxlKSA/ICdkYW5nZXInIDogJydcIj57eyBpdGVtLmluZGV4IH19LiB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiZGNmLXN1YnRpdGxlXCI+e3tpdGVtLmRlc2NyaXB0aW9ufX08L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtIHx8IHVwZGF0aW5nSXRlbT8uW3BrXSAhPT0gaXRlbS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlVXBkYXRlSXRlbShpdGVtLnRpdGxlLCAkaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjcmVhdGUtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVSZW1vdmVJdGVtKGl0ZW0udGl0bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD1jb250ZW50XVwiPjwvbmctY29udGVudD5cblxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgWydjcmVhdGUnLCAndXBkYXRlJ10uaW5jbHVkZXMob3BlcmF0aW9uKSkge1xuICAgICAgICAgIEBpZihpc1VuaXF1ZUVycm9yKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLW5vdC11bmlxdWUtY29udGFpbmVyIGRjZi1hbmltYXRpb24gZGNmLWFuaW1hdGlvbi1ib3R0b20tc21hbGwgZGNmLWFuaW1hdGlvbi1mYXN0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgZGNmLWdyaWQgZGNmLWdyaWQtY29sbGFwc2UgZGNmLXdpZHRoLTEtMSBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLWF1dG9cIiBbYXR0ci5zdHlsZV09XCInbWF4LXdpZHRoOiA1MHB4J1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhbGVydC1jaXJjbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwiZGNmLXRleHQtc21hbGxcIj57eyBsb2NhbGUgKyAnLm5vdF91bmlxdWUnIHwgdHJhbnNsYXRlIDogeyB2YWx1ZTogaXNVbmlxdWVFcnJvciB9IH19PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1tYXJnaW4tYm90dG9tIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4XCI+XG4gICAgICAgICAgICBAaWYodXBkYXRpbmdJdGVtKSB7XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFuZ2VyXCIgKGNsaWNrKT1cImhhbmRsZUNhbmNlbFVwZGF0ZUl0ZW0oKVwiPlxuICAgICAgICAgICAgICAgIHt7IGJ1dHRvbkNhbmNlbExhYmVsIH19XG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIGZpbGw9XCJjbGVhclwiIGNsYXNzPVwiZGNmLWJ1dHRvbi1hZGRcIiAoY2xpY2spPVwiaGFuZGxlQ3JlYXRlSXRlbSgpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB7e2J1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLWFjY29yZGlvbj5cbiAgPC9pb24tYWNjb3JkaW9uLWdyb3VwPlxuPC9maWVsZHNldD5cblxuIl19
@@ -1,4 +1,4 @@
1
- import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
1
+ import { NgModule } from '@angular/core';
2
2
  import { CrudFieldComponent } from './crud-field/crud-field.component';
3
3
  import { CrudFormComponent } from './crud-form/crud-form.component';
4
4
  import { ModelRendererComponent } from './model-renderer/model-renderer.component';
@@ -12,6 +12,7 @@ import { FieldsetComponent } from './fieldset/fieldset.component';
12
12
  import { CollapsableDirective } from '../directives/collapsable.directive';
13
13
  import { LayoutComponent } from './layout/layout.component';
14
14
  import { FilterComponent } from './filter/filter.component';
15
+ import { SteppedFormComponent } from './stepped-form/stepped-form.component';
15
16
  import * as i0 from "@angular/core";
16
17
  const Directives = [CollapsableDirective];
17
18
  const Components = [
@@ -27,7 +28,8 @@ const Components = [
27
28
  CrudFormComponent,
28
29
  FieldsetComponent,
29
30
  LayoutComponent,
30
- FilterComponent
31
+ FilterComponent,
32
+ SteppedFormComponent
31
33
  ];
32
34
  export class ForAngularComponentsModule {
33
35
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ForAngularComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -43,7 +45,8 @@ export class ForAngularComponentsModule {
43
45
  CrudFormComponent,
44
46
  FieldsetComponent,
45
47
  LayoutComponent,
46
- FilterComponent, CollapsableDirective], exports: [ModelRendererComponent,
48
+ FilterComponent,
49
+ SteppedFormComponent, CollapsableDirective], exports: [ModelRendererComponent,
47
50
  ComponentRendererComponent,
48
51
  CrudFieldComponent,
49
52
  CrudFormComponent,
@@ -55,7 +58,8 @@ export class ForAngularComponentsModule {
55
58
  CrudFormComponent,
56
59
  FieldsetComponent,
57
60
  LayoutComponent,
58
- FilterComponent, CollapsableDirective] }); }
61
+ FilterComponent,
62
+ SteppedFormComponent, CollapsableDirective] }); }
59
63
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ForAngularComponentsModule, imports: [CrudFieldComponent,
60
64
  CrudFormComponent,
61
65
  EmptyStateComponent,
@@ -65,15 +69,16 @@ export class ForAngularComponentsModule {
65
69
  PaginationComponent,
66
70
  CrudFormComponent,
67
71
  FieldsetComponent,
68
- FilterComponent] }); }
72
+ FilterComponent,
73
+ SteppedFormComponent] }); }
69
74
  }
70
75
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ForAngularComponentsModule, decorators: [{
71
76
  type: NgModule,
72
77
  args: [{
73
78
  imports: [...Components, ...Directives],
74
79
  declarations: [],
75
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
80
+ schemas: [],
76
81
  exports: [...Components, ...Directives],
77
82
  }]
78
83
  }] });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWFuZ3VsYXItY29tcG9uZW50cy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZm9yLWFuZ3VsYXItY29tcG9uZW50cy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFNUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLHNCQUFzQjtJQUN0QiwwQkFBMEI7SUFDMUIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7Q0FDaEIsQ0FBQztBQVFGLE1BQU0sT0FBTywwQkFBMEI7K0dBQTFCLDBCQUEwQjtnSEFBMUIsMEJBQTBCLFlBckJyQyxzQkFBc0I7WUFDdEIsMEJBQTBCO1lBQzFCLGtCQUFrQjtZQUNsQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixlQUFlLEVBZEcsb0JBQW9CLGFBRXRDLHNCQUFzQjtZQUN0QiwwQkFBMEI7WUFDMUIsa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixtQkFBbUI7WUFDbkIsYUFBYTtZQUNiLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsZUFBZTtZQUNmLGVBQWUsRUFkRyxvQkFBb0I7Z0hBdUIzQiwwQkFBMEIsWUFuQnJDLGtCQUFrQjtZQUNsQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsaUJBQWlCO1lBRWpCLGVBQWU7OzRGQVNKLDBCQUEwQjtrQkFOdEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQztvQkFDdkMsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQztpQkFDeEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3J1ZEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi9jcnVkLWZpZWxkL2NydWQtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENydWRGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2xpc3QtaXRlbS9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RDb21wb25lbnQgfSBmcm9tICcuL2xpc3QvbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmllbGRzZXRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb2xsYXBzYWJsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29sbGFwc2FibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IExheW91dENvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0L2xheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IERpcmVjdGl2ZXMgPSBbQ29sbGFwc2FibGVEaXJlY3RpdmVdO1xuY29uc3QgQ29tcG9uZW50cyA9IFtcbiAgTW9kZWxSZW5kZXJlckNvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQsXG4gIENydWRGaWVsZENvbXBvbmVudCxcbiAgQ3J1ZEZvcm1Db21wb25lbnQsXG4gIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gIExpc3RDb21wb25lbnQsXG4gIExpc3RJdGVtQ29tcG9uZW50LFxuICBTZWFyY2hiYXJDb21wb25lbnQsXG4gIFBhZ2luYXRpb25Db21wb25lbnQsXG4gIENydWRGb3JtQ29tcG9uZW50LFxuICBGaWVsZHNldENvbXBvbmVudCxcbiAgTGF5b3V0Q29tcG9uZW50LFxuICBGaWx0ZXJDb21wb25lbnRcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFsuLi5Db21wb25lbnRzLCAuLi5EaXJlY3RpdmVzXSxcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBleHBvcnRzOiBbLi4uQ29tcG9uZW50cywgLi4uRGlyZWN0aXZlc10sXG59KVxuZXhwb3J0IGNsYXNzIEZvckFuZ3VsYXJDb21wb25lbnRzTW9kdWxlIHt9XG4iXX0=
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWFuZ3VsYXItY29tcG9uZW50cy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZm9yLWFuZ3VsYXItY29tcG9uZW50cy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7QUFFN0UsTUFBTSxVQUFVLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLHNCQUFzQjtJQUN0QiwwQkFBMEI7SUFDMUIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7SUFDZixvQkFBb0I7Q0FDckIsQ0FBQztBQVFGLE1BQU0sT0FBTywwQkFBMEI7K0dBQTFCLDBCQUEwQjtnSEFBMUIsMEJBQTBCLFlBdEJyQyxzQkFBc0I7WUFDdEIsMEJBQTBCO1lBQzFCLGtCQUFrQjtZQUNsQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixlQUFlO1lBQ2Ysb0JBQW9CLEVBZkYsb0JBQW9CLGFBRXRDLHNCQUFzQjtZQUN0QiwwQkFBMEI7WUFDMUIsa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixtQkFBbUI7WUFDbkIsYUFBYTtZQUNiLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsZUFBZTtZQUNmLGVBQWU7WUFDZixvQkFBb0IsRUFmRixvQkFBb0I7Z0hBd0IzQiwwQkFBMEIsWUFwQnJDLGtCQUFrQjtZQUNsQixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsaUJBQWlCO1lBRWpCLGVBQWU7WUFDZixvQkFBb0I7OzRGQVNULDBCQUEwQjtrQkFOdEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQztvQkFDdkMsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRSxFQUFFO29CQUNYLE9BQU8sRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDO2lCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcnVkRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2NydWQtZmllbGQvY3J1ZC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1Db21wb25lbnQgfSBmcm9tICcuL2NydWQtZm9ybS9jcnVkLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE1vZGVsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hiYXJDb21wb25lbnQgfSBmcm9tICcuL3NlYXJjaGJhci9zZWFyY2hiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCB9IGZyb20gJy4vbGlzdC9saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWVsZHNldENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzZXQvZmllbGRzZXQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbGxhcHNhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jb2xsYXBzYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQvbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN0ZXBwZWRGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9zdGVwcGVkLWZvcm0vc3RlcHBlZC1mb3JtLmNvbXBvbmVudCc7XG5cbmNvbnN0IERpcmVjdGl2ZXMgPSBbQ29sbGFwc2FibGVEaXJlY3RpdmVdO1xuY29uc3QgQ29tcG9uZW50cyA9IFtcbiAgTW9kZWxSZW5kZXJlckNvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQsXG4gIENydWRGaWVsZENvbXBvbmVudCxcbiAgQ3J1ZEZvcm1Db21wb25lbnQsXG4gIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gIExpc3RDb21wb25lbnQsXG4gIExpc3RJdGVtQ29tcG9uZW50LFxuICBTZWFyY2hiYXJDb21wb25lbnQsXG4gIFBhZ2luYXRpb25Db21wb25lbnQsXG4gIENydWRGb3JtQ29tcG9uZW50LFxuICBGaWVsZHNldENvbXBvbmVudCxcbiAgTGF5b3V0Q29tcG9uZW50LFxuICBGaWx0ZXJDb21wb25lbnQsXG4gIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbLi4uQ29tcG9uZW50cywgLi4uRGlyZWN0aXZlc10sXG4gIGRlY2xhcmF0aW9uczogW10sXG4gIHNjaGVtYXM6IFtdLFxuICBleHBvcnRzOiBbLi4uQ29tcG9uZW50cywgLi4uRGlyZWN0aXZlc10sXG59KVxuZXhwb3J0IGNsYXNzIEZvckFuZ3VsYXJDb21wb25lbnRzTW9kdWxlIHt9XG4iXX0=
@@ -14,6 +14,7 @@ export * from './searchbar/searchbar.component';
14
14
  // Constants exports
15
15
  export * from './crud-form/constants';
16
16
  export * from './pagination/constants';
17
+ export * from './stepped-form/stepped-form.component';
17
18
  // Module export
18
19
  export * from './for-angular-components.module';
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELG9CQUFvQjtBQUNwQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsZ0JBQWdCO0FBQ2hCLGNBQWMsaUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb21wb25lbnQgZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NydWQtZmllbGQvY3J1ZC1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGF5b3V0L2xheW91dC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saXN0L2xpc3QuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoYmFyL3NlYXJjaGJhci5jb21wb25lbnQnO1xuXG4vLyBDb25zdGFudHMgZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9jcnVkLWZvcm0vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcGFnaW5hdGlvbi9jb25zdGFudHMnO1xuXG4vLyBNb2R1bGUgZXhwb3J0XG5leHBvcnQgKiBmcm9tICcuL2Zvci1hbmd1bGFyLWNvbXBvbmVudHMubW9kdWxlJztcbiJdfQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELG9CQUFvQjtBQUNwQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFFdkMsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxnQkFBZ0I7QUFDaEIsY0FBYyxpQ0FBaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvbXBvbmVudCBleHBvcnRzXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY3J1ZC1maWVsZC9jcnVkLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NydWQtZm9ybS9jcnVkLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZmllbGRzZXQvZmllbGRzZXQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZmlsdGVyL2ZpbHRlci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQvbGF5b3V0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpc3QvbGlzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5cbi8vIENvbnN0YW50cyBleHBvcnRzXG5leHBvcnQgKiBmcm9tICcuL2NydWQtZm9ybS9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vc3RlcHBlZC1mb3JtL3N0ZXBwZWQtZm9ybS5jb21wb25lbnQnO1xuLy8gTW9kdWxlIGV4cG9ydFxuZXhwb3J0ICogZnJvbSAnLi9mb3ItYW5ndWxhci1jb21wb25lbnRzLm1vZHVsZSc7XG4iXX0=