UNPKG

@vendasta/store

Version:

Components and data for Store

214 lines 24.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; export class DropDownFormSectionComponent { constructor() { this.startOpen = false; this.displayAutoTitle = false; this.titleText = ''; this.displayAutoDescription = true; this.descriptionText = ''; this.editingHint = ''; this.expandable = true; this.autoDescriptionText = ''; this.iconName = 'help_outline'; this.subscriptions = []; this.uniqueIndex = 1; this.autoTitleText = ''; } /** * @return {?} */ ngOnInit() { while (this.parentForm.controls.hasOwnProperty(this.titleText + this.uniqueIndex)) { this.uniqueIndex += 1; } this.parentForm.addControl(this.titleText + this.uniqueIndex, this.toFormGroup(this.fields)); /** @type {?} */ const form = (/** @type {?} */ (this.parentForm.controls[this.titleText + this.uniqueIndex])); for (const key in form.controls) { if (form.controls.hasOwnProperty(key)) { if (this.prepopulatedData != null && this.prepopulatedData.hasOwnProperty(key)) { form.controls[key].setValue(this.prepopulatedData[key]); } } } this.subscriptions.push(form.statusChanges.subscribe(change => { /** @type {?} */ let missingFields = false; for (const control in form.controls) { if (!form.controls[control].value || (form.controls[control].value.constructor === Array && !form.controls[control].value[0])) { this.iconName = 'help_outline'; missingFields = true; if (change === 'INVALID') { this.autoTitleText = '* Please fill out all required fields'; if (form.controls[control].dirty || form.controls[control].touched) { this.iconName = 'warning'; break; } } else { this.autoTitleText = 'Optional fields unanswered'; } } } if (!missingFields) { this.iconName = 'check_circle'; this.autoTitleText = 'Complete'; } })); if (this.displayAutoDescription) { this.subscriptions.push(form.valueChanges.subscribe(changes => { /** @type {?} */ let description = ''; for (const key in changes) { if (changes.hasOwnProperty(key) && changes[key] !== null && changes[key].length > 0) { if (changes[key][0].name) { for (const fileKey in changes[key]) { if (changes[key][fileKey] != null) { description += changes[key][fileKey].name; description += ', '; } } } else { description += changes[key]; description += ', '; } } } this.autoDescriptionText = description.substring(0, description.length - 2); })); } form.updateValueAndValidity({ onlySelf: false, emitEvent: true }); } /** * @param {?} formFields * @return {?} */ toFormGroup(formFields) { /** @type {?} */ const group = {}; formFields.forEach(field => { /** @type {?} */ let formControl; if (field.controlType === 'checkbox') { formControl = new FormControl(field.value); } else { formControl = field.required ? new FormControl(field.value, Validators.required) : new FormControl(field.value); } group[field.id] = formControl; this.subscriptions.push(formControl.valueChanges.subscribe(value => (field.value = value))); }); return new FormGroup(group); } /** * @return {?} */ ngOnDestroy() { this.subscriptions.forEach(subscription => subscription.unsubscribe()); } } DropDownFormSectionComponent.decorators = [ { type: Component, args: [{ selector: 'va-dropdown-form-section', template: ` <mat-card *ngIf="!expandable && !(expandable == undefined)" class="not-expandable-card"> <mat-icon class="not-expandable-icon valid"> check_circle</mat-icon> <mat-card-header *ngIf="!displayAutoTitle" class="not-expandable-header"> {{ titleText }} </mat-card-header> <mat-card-header *ngIf="displayAutoTitle" class="not-expandable-header valid"> <div class="title"> {{ titleText }}</div> <div *ngIf="titleText && autoTitleText">&nbsp;</div> <ng-container><i> Complete </i></ng-container> </mat-card-header> <mat-panel-description class="not-expandable-description"> {{ descriptionText }} </mat-panel-description> </mat-card> <mat-expansion-panel *ngIf="expandable || expandable == undefined" [expanded]="startOpen"> <mat-expansion-panel-header> <div class="dropdown-form-header"> <mat-icon [ngClass]="{invalid: iconName=='warning', valid: iconName=='check_circle', question: iconName=='help_outline'}"> {{ iconName }} </mat-icon> <mat-panel-title *ngIf="!displayAutoTitle"> {{ titleText }} </mat-panel-title> <mat-panel-title *ngIf="displayAutoTitle" [ngClass]="{valid: iconName=='check_circle', invalid: iconName=='warning'}"> <div class="title"> {{ titleText }}</div> <div *ngIf="titleText && autoTitleText"> &nbsp;</div> <ng-container><i> {{autoTitleText}} </i></ng-container> </mat-panel-title> <mat-panel-description *ngIf="displayAutoDescription" [ngClass]="{invalid: iconName=='warning'}"> {{ autoDescriptionText }} </mat-panel-description> <mat-panel-description *ngIf="!displayAutoDescription" [ngClass]="{invalid: iconName=='warning'}"> <i> {{descriptionText}} </i> </mat-panel-description> </div> </mat-expansion-panel-header> <div class="expansion-panel-body"> <va-field *ngFor="let field of fields" [field]="field" [form]="parentForm.controls[titleText + uniqueIndex]"></va-field> <p *ngIf="editingHint != ''" class="editing-hint"><i>{{ editingHint }}</i></p> </div> </mat-expansion-panel> `, styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block;width:60%}.mat-expanded,.mat-expansion-panel{transition:margin .4s}.dropdown-form-header{width:100%;display:flex}mat-panel-description{align-self:center;flex:inherit;display:initial;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}mat-panel-description.invalid{color:#c62828}mat-icon{margin-right:7px;-ms-grid-row-align:center;align-self:center}mat-icon.valid{color:#4caf50}mat-icon.invalid{color:#c62828}mat-icon.question{color:#9e9e9e}mat-panel-title{-ms-grid-row-align:center;align-self:center;flex:none;margin-right:20px}mat-panel-title.valid{color:#4caf50}mat-panel-title.invalid{color:#c62828}.editing-hint{color:#9e9e9e}.title{color:#212121}.not-expandable-card{background:#fff;cursor:default;font-size:15px;display:flex;height:48px;align-items:center;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.not-expandable-card .not-expandable-icon{margin-left:24px}.not-expandable-card .not-expandable-header{display:flex}.not-expandable-card .not-expandable-description{margin-left:22px}.not-expandable-card .valid{color:#4caf50}"] }] } ]; /** @nocollapse */ DropDownFormSectionComponent.ctorParameters = () => []; DropDownFormSectionComponent.propDecorators = { prepopulatedData: [{ type: Input }], startOpen: [{ type: Input }], parentForm: [{ type: Input }], displayAutoTitle: [{ type: Input }], titleText: [{ type: Input }], displayAutoDescription: [{ type: Input }], descriptionText: [{ type: Input }], fields: [{ type: Input }], editingHint: [{ type: Input }], expandable: [{ type: Input }] }; if (false) { /** @type {?} */ DropDownFormSectionComponent.prototype.prepopulatedData; /** @type {?} */ DropDownFormSectionComponent.prototype.startOpen; /** @type {?} */ DropDownFormSectionComponent.prototype.parentForm; /** @type {?} */ DropDownFormSectionComponent.prototype.displayAutoTitle; /** @type {?} */ DropDownFormSectionComponent.prototype.titleText; /** @type {?} */ DropDownFormSectionComponent.prototype.displayAutoDescription; /** @type {?} */ DropDownFormSectionComponent.prototype.descriptionText; /** @type {?} */ DropDownFormSectionComponent.prototype.fields; /** @type {?} */ DropDownFormSectionComponent.prototype.editingHint; /** @type {?} */ DropDownFormSectionComponent.prototype.expandable; /** @type {?} */ DropDownFormSectionComponent.prototype.autoDescriptionText; /** @type {?} */ DropDownFormSectionComponent.prototype.iconName; /** @type {?} */ DropDownFormSectionComponent.prototype.subscriptions; /** @type {?} */ DropDownFormSectionComponent.prototype.uniqueIndex; /** @type {?} */ DropDownFormSectionComponent.prototype.autoTitleText; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9vcmRlci1mb3JtL2Ryb3Bkb3duLWZvcm0tc2VjdGlvbi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzRHBFLE1BQU0sT0FBTyw0QkFBNEI7SUFpQnZDO1FBZlMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixhQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzFCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztJQUVKLENBQUM7Ozs7SUFFaEIsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pGLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMs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QUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQzs7O1lBdkpGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMEJBQTBCO2dCQUNwQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDs7YUFFRjs7Ozs7K0JBRUUsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FDQUNMLEtBQUs7OEJBQ0wsS0FBSztxQkFDTCxLQUFLOzBCQUNMLEtBQUs7eUJBQ0wsS0FBSzs7OztJQVROLHdEQUE4Qjs7SUFDOUIsaURBQTJCOztJQUMzQixrREFBK0I7O0lBQy9CLHdEQUFrQzs7SUFDbEMsaURBQXdCOztJQUN4Qiw4REFBdUM7O0lBQ3ZDLHVEQUE4Qjs7SUFDOUIsOENBQWtDOztJQUNsQyxtREFBMEI7O0lBQzFCLGtEQUEyQjs7SUFDM0IsMkRBQXlCOztJQUN6QixnREFBMEI7O0lBQzFCLHFEQUFtQzs7SUFDbkMsbURBQWdCOztJQUNoQixxREFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gJy4uL2ZpZWxkcy9maWVsZC1iYXNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1kcm9wZG93bi1mb3JtLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxtYXQtY2FyZCAqbmdJZj1cIiFleHBhbmRhYmxlICYmICEoZXhwYW5kYWJsZSA9PSB1bmRlZmluZWQpXCIgY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1jYXJkXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1pY29uIHZhbGlkXCI+IGNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8bWF0LWNhcmQtaGVhZGVyICpuZ0lmPVwiIWRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cIm5vdC1leHBhbmRhYmxlLWhlYWRlclwiPlxuICAgICAgICB7eyB0aXRsZVRleHQgfX1cbiAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cImRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cIm5vdC1leHBhbmRhYmxlLWhlYWRlciB2YWxpZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ge3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0aXRsZVRleHQgJiYgYXV0b1RpdGxlVGV4dFwiPiZuYnNwOzwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyPjxpPiBDb21wbGV0ZSA8L2k+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtcGFuZWwtZGVzY3JpcHRpb24gY2xhc3M9XCJub3QtZXhwYW5kYWJsZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICB7eyBkZXNjcmlwdGlvblRleHQgfX1cbiAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgIDwvbWF0LWNhcmQ+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nSWY9XCJleHBhbmRhYmxlIHx8IGV4cGFuZGFibGUgPT0gdW5kZWZpbmVkXCIgW2V4cGFuZGVkXT1cInN0YXJ0T3BlblwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZm9ybS1oZWFkZXJcIj5cbiAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntpbnZhbGlkOiBpY29uTmFtZT09J3dhcm5pbmcnLCB2YWxpZDogaWNvbk5hbWU9PSdjaGVja19jaXJjbGUnLCBxdWVzdGlvbjogaWNvbk5hbWU9PSdoZWxwX291dGxpbmUnfVwiPlxuICAgICAgICAgICAge3sgaWNvbk5hbWUgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgKm5nSWY9XCIhZGlzcGxheUF1dG9UaXRsZVwiPlxuICAgICAgICAgICAge3sgdGl0bGVUZXh0IH19XG4gICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZSAqbmdJZj1cImRpc3BsYXlBdXRvVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie3ZhbGlkOiBpY29uTmFtZT09J2NoZWNrX2NpcmNsZScsIGludmFsaWQ6IGljb25OYW1lPT0nd2FybmluZyd9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ge3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGl0bGVUZXh0ICYmIGF1dG9UaXRsZVRleHRcIj4gJm5ic3A7PC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPjxpPiB7e2F1dG9UaXRsZVRleHR9fSA8L2k+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiAqbmdJZj1cImRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7aW52YWxpZDogaWNvbk5hbWU9PSd3YXJuaW5nJ31cIj5cbiAgICAgICAgICAgIHt7IGF1dG9EZXNjcmlwdGlvblRleHQgfX1cbiAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICA8bWF0LXBhbmVsLWRlc2NyaXB0aW9uICpuZ0lmPVwiIWRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7aW52YWxpZDogaWNvbk5hbWU9PSd3YXJuaW5nJ31cIj5cbiAgICAgICAgICAgIDxpPiB7e2Rlc2NyaXB0aW9uVGV4dH19IDwvaT5cbiAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImV4cGFuc2lvbi1wYW5lbC1ib2R5XCI+XG4gICAgICAgIDx2YS1maWVsZCAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInBhcmVudEZvcm0uY29udHJvbHNbdGl0bGVUZXh0ICsgdW5pcXVlSW5kZXhdXCI+PC92YS1maWVsZD5cbiAgICAgICAgPHAgKm5nSWY9XCJlZGl0aW5nSGludCAhPSAnJ1wiIGNsYXNzPVwiZWRpdGluZy1oaW50XCI+PGk+e3sgZWRpdGluZ0hpbnQgfX08L2k+PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEcm9wRG93bkZvcm1TZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcmVwb3B1bGF0ZWREYXRhOiB7fTtcbiAgQElucHV0KCkgc3RhcnRPcGVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhcmVudEZvcm06IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZGlzcGxheUF1dG9UaXRsZSA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZVRleHQgPSAnJztcbiAgQElucHV0KCkgZGlzcGxheUF1dG9EZXNjcmlwdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uVGV4dCA9ICcnO1xuICBASW5wdXQoKSBmaWVsZHM6IEZpZWxkQmFzZTxhbnk+W107XG4gIEBJbnB1dCgpIGVkaXRpbmdIaW50ID0gJyc7XG4gIEBJbnB1dCgpIGV4cGFuZGFibGUgPSB0cnVlO1xuICBhdXRvRGVzY3JpcHRpb25UZXh0ID0gJyc7XG4gIGljb25OYW1lID0gJ2hlbHBfb3V0bGluZSc7XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHVuaXF1ZUluZGV4ID0gMTtcbiAgYXV0b1RpdGxlVGV4dCA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5wYXJlbnRGb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMudGl0bGVUZXh0ICsgdGhpcy51bmlxdWVJbmRleCkpIHtcbiAgICAgIHRoaXMudW5pcXVlSW5kZXggKz0gMTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRGb3JtLmFkZENvbnRyb2wodGhpcy50aXRsZVRleHQgKyB0aGlzLnVuaXF1ZUluZGV4LCB0aGlzLnRvRm9ybUdyb3VwKHRoaXMuZmllbGRzKSk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMucGFyZW50Rm9ybS5jb250cm9sc1t0aGlzLnRpdGxlVGV4dCArIHRoaXMudW5pcXVlSW5kZXhdIGFzIEZvcm1Hcm91cDtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgIGlmIChmb3JtLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHRoaXMucHJlcG9wdWxhdGVkRGF0YSAhPSBudWxsICYmIHRoaXMucHJlcG9wdWxhdGVkRGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgZm9ybS5jb250cm9sc1trZXldLnNldFZhbHVlKHRoaXMucHJlcG9wdWxhdGVkRGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGZvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgICAgbGV0IG1pc3NpbmdGaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgICAgICBpZiAoIWZvcm0uY29udHJvbHNbY29udHJvbF0udmFsdWUgfHwgKGZvcm0uY29udHJvbHNbY29udHJvbF0udmFsdWUuY29uc3RydWN0b3IgPT09IEFycmF5ICYmICFmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5pY29uTmFtZSA9ICdoZWxwX291dGxpbmUnO1xuICAgICAgICAgICAgbWlzc2luZ0ZpZWxkcyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY2hhbmdlID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvVGl0bGVUZXh0ID0gJyogUGxlYXNlIGZpbGwgb3V0IGFsbCByZXF1aXJlZCBmaWVsZHMnO1xuICAgICAgICAgICAgICBpZiAoZm9ybS5jb250cm9sc1tjb250cm9sXS5kaXJ0eSB8fCBmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ3dhcm5pbmcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSAnT3B0aW9uYWwgZmllbGRzIHVuYW5zd2VyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1pc3NpbmdGaWVsZHMpIHtcbiAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2NoZWNrX2NpcmNsZSc7XG4gICAgICAgICAgdGhpcy5hdXRvVGl0bGVUZXh0ID0gJ0NvbXBsZXRlJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGxheUF1dG9EZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2VzID0+IHtcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNoYW5nZXNba2V5XSAhPT0gbnVsbCAmJiBjaGFuZ2VzW2tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpZiAoY2hhbmdlc1trZXldWzBdLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVLZXkgaW4gY2hhbmdlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlc1trZXldW2ZpbGVLZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gY2hhbmdlc1trZXldW2ZpbGVLZXldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICcsICc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IGNoYW5nZXNba2V5XTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAnLCAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYXV0b0Rlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCBkZXNjcmlwdGlvbi5sZW5ndGggLSAyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiBmYWxzZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgdG9Gb3JtR3JvdXAoZm9ybUZpZWxkczogRmllbGRCYXNlPGFueT5bXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBsZXQgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICAgICAgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1Db250cm9sID0gZmllbGQucmVxdWlyZWQgPyBuZXcgRm9ybUNvbnRyb2woZmllbGQudmFsdWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpIDogbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGdyb3VwW2ZpZWxkLmlkXSA9IGZvcm1Db250cm9sO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiAoZmllbGQudmFsdWUgPSB2YWx1ZSkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iXX0=