UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

221 lines (220 loc) 21.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Output, EventEmitter, Input, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef } from "@angular/core"; import { toPromise, clone, compareValue } from "../utils"; import { LabelService } from "../service/label.service"; import { ErrorHandler } from "../error-handler/error-handler"; import { NgForm } from "@angular/forms"; import { Subject } from "rxjs"; import { debounceTime } from "rxjs/operators"; import { LabelColor } from "../shared/shared.const"; export class CreateEditLabelComponent { /** * @param {?} labelService * @param {?} errorHandler * @param {?} ref */ constructor(labelService, errorHandler, ref) { this.labelService = labelService; this.errorHandler = errorHandler; this.ref = ref; this.labelModel = this.initLabel(); this.labelId = 0; this.isLabelNameExist = false; this.nameChecker = new Subject(); this.reload = new EventEmitter(); } /** * @return {?} */ ngOnInit() { this.nameChecker.pipe(debounceTime(500)).subscribe((name) => { toPromise(this.labelService.getLabels(this.scope, this.projectId, name)) .then(targets => { this.isLabelNameExist = false; if (targets && targets.length) { if (targets.find((target) => { return target.name === name; })) { this.isLabelNameExist = true; } } }) .catch(error => { this.errorHandler.error(error); }); /** @type {?} */ let hnd = setInterval(() => this.ref.markForCheck(), 100); setTimeout(() => clearInterval(hnd), 5000); }); } /** * @return {?} */ ngOnDestroy() { this.nameChecker.unsubscribe(); } /** * @return {?} */ get labelColor() { return LabelColor; } /** * @return {?} */ initLabel() { return { name: "", description: "", color: "", scope: "", project_id: 0 }; } /** * @return {?} */ openModal() { this.labelModel = this.initLabel(); this.formShow = true; this.isLabelNameExist = false; this.labelId = 0; this.copeLabelModel = null; } /** * @param {?} labelId * @param {?} label * @return {?} */ editModel(labelId, label) { this.labelModel = clone(label[0]); this.formShow = true; this.labelId = labelId; this.copeLabelModel = clone(label[0]); } /** * @return {?} */ get hasChanged() { return !compareValue(this.copeLabelModel, this.labelModel); } /** * @return {?} */ get isValid() { return !(this.isLabelNameExist || !(this.currentForm && this.currentForm.valid) || !this.hasChanged || this.inProgress); } /** * @param {?} text * @return {?} */ existValid(text) { if (text) { this.nameChecker.next(text); } else { this.isLabelNameExist = false; } } /** * @return {?} */ onSubmit() { this.inProgress = true; if (this.labelId <= 0) { this.labelModel.scope = this.scope; this.labelModel.project_id = this.projectId; toPromise(this.labelService.createLabel(this.labelModel)) .then(res => { this.inProgress = false; this.reload.emit(); this.labelModel = this.initLabel(); this.formShow = false; }) .catch(err => { this.inProgress = false; this.errorHandler.error(err); }); } else { toPromise(this.labelService.updateLabel(this.labelId, this.labelModel)) .then(res => { this.inProgress = false; this.reload.emit(); this.labelModel = this.initLabel(); this.formShow = false; }) .catch(err => { this.inProgress = false; this.errorHandler.error(err); }); } } /** * @return {?} */ onCancel() { this.inProgress = false; this.labelModel = this.initLabel(); this.formShow = false; } } CreateEditLabelComponent.decorators = [ { type: Component, args: [{ selector: "hbr-create-edit-label", template: "<div>\n <form #labelForm=\"ngForm\" [hidden]=\"!formShow\">\n <section>\n <label>\n <label for=\"name\">{{'LABEL.LABEL_NAME' | translate}}</label>\n <label aria-haspopup=\"true\" role=\"tooltip\" [class.invalid]=\"isLabelNameExist\"\n class=\"tooltip tooltip-validation tooltip-md tooltip-bottom-left\">\n <input type=\"text\" id=\"name\" name=\"name\" required size=\"20\" autocomplete=\"off\"\n [(ngModel)]=\"labelModel.name\" #name=\"ngModel\" (keyup)=\"existValid(labelModel.name)\">\n <span class=\"tooltip-content\">\n {{'LABEL.NAME_ALREADY_EXISTS' | translate }}\n </span>\n </label>\n </label>\n <label>\n <label for=\"color\">{{'LABEL.COLOR' | translate}}</label>\n <clr-dropdown [clrCloseMenuOnItemClick]=\"false\" clrDropdownTrigger>\n <clr-icon shape=\"caret down\" class=\"btn btn-outline btnColor btn-sm\"></clr-icon>\n <clr-dropdown-menu *clrIfOpen>\n <label class=\"dropdown-item\" (click)=\"labelModel.color=i.color\" *ngFor=\"let i of labelColor\"\n [class.borderSty]=\"i.color == '#FFFFFF'\" [ngStyle]=\"{'background-color': i.color, 'color': i.textColor }\">Aa</label>\n </clr-dropdown-menu>\n </clr-dropdown>\n <input type=\"text\" id=\"color\" size=\"8\" name=\"color\" disabled [(ngModel)]=\"labelModel.color\" #color=\"ngModel\">\n </label>\n <label>\n <label for=\"description\">{{'LABEL.DESCRIPTION' | translate}}</label>\n <input type=\"text\" id=\"description\" name=\"description\" size=\"30\" [(ngModel)]=\"labelModel.description\"\n #description=\"ngModel\">\n </label>\n <label>\n <button type=\"button\" class=\"btn btn-sm btn-outline\" (click)=\"onCancel()\" [disabled]=\"inProgress\">{{\n 'BUTTON.CANCEL' | translate }}\n </button>\n <button type=\"submit\" class=\"btn btn-sm btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!isValid\">{{\n 'BUTTON.OK' | translate }}\n </button>\n </label>\n </section>\n </form>\n</div>", changeDetection: ChangeDetectionStrategy.Default, styles: ["form{margin-bottom:-10px;padding-top:0;margin-top:20px;width:100%;background-color:#eee;border:1px solid #ccc}form section{padding:.5rem 0}form section>label{margin-left:20px}form .btnColor{margin:0!important;padding:0!important;width:26px;height:22px;min-width:26px}form .colorPanel span{margin:5px 4px;width:30px;height:24px;text-align:center;line-height:24px;font-size:12px;border:1px solid #a1a1a1}form .dropdown-menu{display:inline-block;width:166px;padding:6px}form .dropdown-menu .dropdown-item{display:inline-block;margin:2px 4px;padding:0;width:30px;height:24px;text-align:center;line-height:24px;border:0;color:#fff;font-size:12px}form .dropdown .dropdown-toggle.btn{padding:0!important}form .borderSty{border:1px solid #a1a1a1!important;line-height:22px}"] }] } ]; /** @nocollapse */ CreateEditLabelComponent.ctorParameters = () => [ { type: LabelService }, { type: ErrorHandler }, { type: ChangeDetectorRef } ]; CreateEditLabelComponent.propDecorators = { currentForm: [{ type: ViewChild, args: ["labelForm",] }], projectId: [{ type: Input }], scope: [{ type: Input }], reload: [{ type: Output }] }; if (false) { /** @type {?} */ CreateEditLabelComponent.prototype.formShow; /** @type {?} */ CreateEditLabelComponent.prototype.inProgress; /** @type {?} */ CreateEditLabelComponent.prototype.copeLabelModel; /** @type {?} */ CreateEditLabelComponent.prototype.labelModel; /** @type {?} */ CreateEditLabelComponent.prototype.labelId; /** @type {?} */ CreateEditLabelComponent.prototype.isLabelNameExist; /** @type {?} */ CreateEditLabelComponent.prototype.nameChecker; /** @type {?} */ CreateEditLabelComponent.prototype.labelForm; /** @type {?} */ CreateEditLabelComponent.prototype.currentForm; /** @type {?} */ CreateEditLabelComponent.prototype.projectId; /** @type {?} */ CreateEditLabelComponent.prototype.scope; /** @type {?} */ CreateEditLabelComponent.prototype.reload; /** @type {?} */ CreateEditLabelComponent.prototype.labelService; /** @type {?} */ CreateEditLabelComponent.prototype.errorHandler; /** @type {?} */ CreateEditLabelComponent.prototype.ref; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVkaXQtbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhhcmJvci91aS8iLCJzb3VyY2VzIjpbInNyYy9jcmVhdGUtZWRpdC1sYWJlbC9jcmVhdGUtZWRpdC1sYWJlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFFWixLQUFLLEVBRUwsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVFwRCxNQUFNOzs7Ozs7SUFrQkosWUFDVSxjQUNBLGNBQ0E7UUFGQSxpQkFBWSxHQUFaLFlBQVk7UUFDWixpQkFBWSxHQUFaLFlBQVk7UUFDWixRQUFHLEdBQUgsR0FBRzswQkFqQk8sSUFBSSxDQUFDLFNBQVMsRUFBRTt1QkFDMUIsQ0FBQztnQ0FFUSxLQUFLOzJCQUVWLElBQUksT0FBTyxFQUFVO3NCQU9oQixJQUFJLFlBQVksRUFBRTtLQU1qQzs7OztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVB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RyxLQUFLLENBQUM7YUFDdkIsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzlCLENBQUMsQ0FBQztTQUNOO0tBQ0Y7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7S0FDdkI7OztZQS9JRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsbzZFQUFpRDtnQkFFakQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE9BQU87O2FBQ2pEOzs7O1lBWlEsWUFBWTtZQUNaLFlBQVk7WUFSbkIsaUJBQWlCOzs7MEJBZ0NoQixTQUFTLFNBQUMsV0FBVzt3QkFFckIsS0FBSztvQkFDTCxLQUFLO3FCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTcgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IExhYmVsIH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5cbmltcG9ydCB7IHRvUHJvbWlzZSwgY2xvbmUsIGNvbXBhcmVWYWx1ZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBMYWJlbFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9sYWJlbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi4vZXJyb3ItaGFuZGxlci9lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBMYWJlbENvbG9yIH0gZnJvbSBcIi4uL3NoYXJlZC9zaGFyZWQuY29uc3RcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhici1jcmVhdGUtZWRpdC1sYWJlbFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NyZWF0ZS1lZGl0LWxhYmVsLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jcmVhdGUtZWRpdC1sYWJlbC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZUVkaXRMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZm9ybVNob3c6IGJvb2xlYW47XG4gIGluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGNvcGVMYWJlbE1vZGVsOiBMYWJlbDtcbiAgbGFiZWxNb2RlbDogTGFiZWwgPSB0aGlzLmluaXRMYWJlbCgpO1xuICBsYWJlbElkID0gMDtcblxuICBpc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG5cbiAgbmFtZUNoZWNrZXIgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgbGFiZWxGb3JtOiBOZ0Zvcm07XG4gIEBWaWV3Q2hpbGQoXCJsYWJlbEZvcm1cIikgY3VycmVudEZvcm06IE5nRm9ybTtcblxuICBASW5wdXQoKSBwcm9qZWN0SWQ6IG51bWJlcjtcbiAgQElucHV0KCkgc2NvcGU6IHN0cmluZztcbiAgQE91dHB1dCgpIHJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWVDaGVja2VyLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpLnN1YnNjcmliZSgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICB0b1Byb21pc2U8TGFiZWxbXT4oXG4gICAgICAgIHRoaXMubGFiZWxTZXJ2aWNlLmdldExhYmVscyh0aGlzLnNjb3BlLCB0aGlzLnByb2plY3RJZCwgbmFtZSlcbiAgICAgIClcbiAgICAgICAgLnRoZW4odGFyZ2V0cyA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHRhcmdldHMgJiYgdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRzLmZpbmQoKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWUgPT09IG5hbWU7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICB0aGlzLmlzTGFiZWxOYW1lRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgbGV0IGhuZCA9IHNldEludGVydmFsKCgpID0+IHRoaXMucmVmLm1hcmtGb3JDaGVjaygpLCAxMDApO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBjbGVhckludGVydmFsKGhuZCksIDUwMDApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lQ2hlY2tlci51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XG4gICAgcmV0dXJuIExhYmVsQ29sb3I7XG4gIH1cblxuICBpbml0TGFiZWwoKTogTGFiZWwge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBcIlwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgICBjb2xvcjogXCJcIixcbiAgICAgIHNjb3BlOiBcIlwiLFxuICAgICAgcHJvamVjdF9pZDogMFxuICAgIH07XG4gIH1cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubGFiZWxNb2RlbCA9IHRoaXMuaW5pdExhYmVsKCk7XG4gICAgdGhpcy5mb3JtU2hvdyA9IHRydWU7XG4gICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0ID0gZmFsc2U7XG4gICAgdGhpcy5sYWJlbElkID0gMDtcbiAgICB0aGlzLmNvcGVMYWJlbE1vZGVsID0gbnVsbDtcbiAgfVxuXG4gIGVkaXRNb2RlbChsYWJlbElkOiBudW1iZXIsIGxhYmVsOiBMYWJlbFtdKTogdm9pZCB7XG4gICAgdGhpcy5sYWJlbE1vZGVsID0gY2xvbmUobGFiZWxbMF0pO1xuICAgIHRoaXMuZm9ybVNob3cgPSB0cnVlO1xuICAgIHRoaXMubGFiZWxJZCA9IGxhYmVsSWQ7XG4gICAgdGhpcy5jb3BlTGFiZWxNb2RlbCA9IGNsb25lKGxhYmVsWzBdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbXBhcmVWYWx1ZSh0aGlzLmNvcGVMYWJlbE1vZGVsLCB0aGlzLmxhYmVsTW9kZWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKFxuICAgICAgdGhpcy5pc0xhYmVsTmFtZUV4aXN0IHx8XG4gICAgICAhKHRoaXMuY3VycmVudEZvcm0gJiYgdGhpcy5jdXJyZW50Rm9ybS52YWxpZCkgfHxcbiAgICAgICF0aGlzLmhhc0NoYW5nZWQgfHxcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1xuICAgICk7XG4gIH1cblxuICBleGlzdFZhbGlkKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICB0aGlzLm5hbWVDaGVja2VyLm5leHQodGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMYWJlbE5hbWVFeGlzdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgaWYgKHRoaXMubGFiZWxJZCA8PSAwKSB7XG4gICAgICB0aGlzLmxhYmVsTW9kZWwuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgdGhpcy5sYWJlbE1vZGVsLnByb2plY3RfaWQgPSB0aGlzLnByb2plY3RJZDtcbiAgICAgIHRvUHJvbWlzZTxMYWJlbD4odGhpcy5sYWJlbFNlcnZpY2UuY3JlYXRlTGFiZWwodGhpcy5sYWJlbE1vZGVsKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5sYWJlbE1vZGVsID0gdGhpcy5pbml0TGFiZWwoKTtcbiAgICAgICAgICB0aGlzLmZvcm1TaG93ID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1Byb21pc2U8TGFiZWw+KFxuICAgICAgICB0aGlzLmxhYmVsU2VydmljZS51cGRhdGVMYWJlbCh0aGlzLmxhYmVsSWQsIHRoaXMubGFiZWxNb2RlbClcbiAgICAgIClcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbG9hZC5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5sYWJlbE1vZGVsID0gdGhpcy5pbml0TGFiZWwoKTtcbiAgICAgICAgICB0aGlzLmZvcm1TaG93ID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMubGFiZWxNb2RlbCA9IHRoaXMuaW5pdExhYmVsKCk7XG4gICAgdGhpcy5mb3JtU2hvdyA9IGZhbHNlO1xuICB9XG59XG4iXX0=