UNPKG

ontimize-web-ngx

Version:
358 lines 49.1 kB
import { __decorate, __metadata } from "tslib"; import { ContentChildren, Directive, EventEmitter, HostListener, Injector, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { Subject } from 'rxjs'; import { BooleanInputConverter } from '../../../../decorators/input-converter'; import { OMatErrorDirective } from '../../../../directives/o-mat-error.directive'; import { SnackBarService } from '../../../../services/snackbar.service'; import { OTranslateService } from '../../../../services/translate/o-translate.service'; import { OValidatorComponent } from '../../../../shared/components/validation/o-validator.component'; import { ObservableWrapper } from '../../../../util/async'; import { Codes } from '../../../../util/codes'; import { ErrorsUtils } from '../../../../util/errors'; import { Util } from '../../../../util/util'; import { OTableColumnComponent } from '../o-table-column.component'; import * as i0 from "@angular/core"; export const DEFAULT_INPUTS_O_TABLE_CELL_EDITOR = [ 'orequired: required', 'showPlaceHolder: show-placeholder', 'olabel: label', 'updateRecordOnEdit: update-record-on-edit', 'showNotificationOnEdit: show-notification-on-edit', 'enabled' ]; export const DEFAULT_OUTPUTS_O_TABLE_CELL_EDITOR = [ 'editionStarted', 'editionCancelled', 'editionCommitted', 'onPostUpdateRecord' ]; export class OBaseTableCellEditor { onDocumentKeyup(event) { this.handleKeyup(event); } constructor(injector) { this.injector = injector; this.orequired = false; this.showPlaceHolder = false; this.updateRecordOnEdit = true; this.showNotificationOnEdit = true; this._enabled = true; this.formGroup = new UntypedFormGroup({}); this.editionStarted = new EventEmitter(); this.editionCancelled = new EventEmitter(); this.editionCommitted = new EventEmitter(); this.onPostUpdateRecord = new EventEmitter(); this.editorCreated = new EventEmitter(); this.registerInColumn = true; this.errorsData = []; this.destroy$ = new Subject(); this.tooltipPosition = 'below'; this.tooltipShowDelay = 500; this.tooltipHideDelay = 0; this.snackBarService = this.injector.get(SnackBarService); this.tableColumn = this.injector.get(OTableColumnComponent); this.translateService = this.injector.get(OTranslateService); this.cellEditorId = Util.randomNumber().toString(36); this.renderer = this.injector.get(Renderer2); this.errorOptions = ErrorsUtils.getErrorOptions(this.injector); } ngOnInit() { this.initialize(); } ngOnChanges() { this.updateValidators(); } ngAfterViewInit() { if (this.validatorChildren) { this.validatorsSubscription = this.validatorChildren.changes.subscribe(() => { this.updateValidators(); }); if (this.validatorChildren.length > 0) { this.updateValidators(); } } } ngOnDestroy() { this.destroy$.next(void 0); this.destroy$.complete(); } initialize() { this.createFormControl(); this.registerEditor(); this.editorCreated.emit(this); } handleKeyup(event) { const oColumn = this.table.getOColumn(this.tableColumnAttr); if (!oColumn || !oColumn.editing) { return; } const escClicked = this.checkKey(event, 'Escape', 27); const enterClicked = this.checkKey(event, 'Enter', 13); const tabClicked = this.checkKey(event, 'Tab', 9); if (!escClicked && !enterClicked && !tabClicked) { return; } if (escClicked) { this.onEscClicked(); return; } if (this.table.editingCell && !this.table.editingCell.contains(event.target)) { return; } if (enterClicked || tabClicked) { this.commitEdition(); } } checkKey(event, key, keyCode) { return (event.key && event.key === key) || (event.keyCode && event.keyCode === keyCode); } createFormControl() { if (!this.formControl) { const validators = this.resolveValidators(); const asyncValidators = this.resolveAsyncValidators(); const cfg = { value: undefined, disabled: !this.enabled }; this.formControl = new UntypedFormControl(cfg, validators, asyncValidators); } if (!Util.isDefined(this.formGroup.get(this.cellEditorId))) { this.formGroup.addControl(this.cellEditorId, this.formControl); } } registerEditor() { if (this.registerInColumn && !Util.isDefined(this.tableColumn.editor)) { this.tableColumn.registerEditor(this); if (!Util.isDefined(this.type) && Util.isDefined(this.tableColumn.type)) { this.type = this.tableColumn.type; } } } getCellData() { return this._rowData[this.tableColumnAttr]; } startEdition(data) { this.formGroup.reset(); this.rowData = data; if (!this.isSilentControl()) { this.editionStarted.emit(this._rowData); } this.table.cd.detectChanges(); const inputEl = document.getElementById(this.cellEditorId); if (inputEl) { inputEl.select(); } this.setEditingRowClass(true); } endEdition(saveChanges) { const oColumn = this.table.getOColumn(this.tableColumnAttr); if (oColumn) { const updateObserver = this.table.updateCellData(oColumn, this._rowData, saveChanges); if (updateObserver) { updateObserver.subscribe(res => { this.onUpdateSuccess(res); this.table.daoTable.setDataArray(this.table.daoTable.data); }, error => { this._rowData[this.tableColumnAttr] = this.oldValue; this.table.dataSource.updateRenderedRowData(this._rowData); this.table.showDialogError(error, 'MESSAGES.ERROR_UPDATE'); this.table.cd.detectChanges(); }); } else { this.table.saveScrollPosition(); this.table.cd.detectChanges(); } } } commitEdition() { if (!this.formControl.invalid) { this.oldValue = this._rowData[this.tableColumnAttr]; this._rowData[this.tableColumnAttr] = this.formControl.value; if (!this.isSilentControl()) { this.endEdition(true); this.editionCommitted.emit(this._rowData); } } } get tableColumn() { return this._tableColumn; } set tableColumn(arg) { this._tableColumn = arg; if (arg) { this._table = arg.table; } } get tableColumnAttr() { if (this._tableColumn) { return this._tableColumn.attr; } return undefined; } set table(arg) { this._table = arg; } get table() { return this._table; } get rowData() { return this._rowData; } set rowData(arg) { this._rowData = arg; const cellData = this.getCellData(); this.formControl.setValue(cellData); this.formControl.markAsTouched(); } resolveValidators() { const validators = []; if (this.tableColumn.angularValidatorsFn && this.tableColumn.angularValidatorsFn.length > 0) { validators.push(...this.tableColumn.angularValidatorsFn); ErrorsUtils.pushToErrorsData(this, this.tableColumn.angularValidatorsFnErrors); } if (this.orequired) { validators.push(Validators.required); } return validators; } resolveAsyncValidators() { if (this.tableColumn.angularAsyncValidatorsFn && this.tableColumn.angularAsyncValidatorsFn.length > 0) { ErrorsUtils.pushToErrorsData(this, this.tableColumn.angularValidatorsFnErrors); } return this.tableColumn.angularAsyncValidatorsFn || []; } getActiveOErrors() { return ErrorsUtils.getActiveOErrors(this); } getErrorText(oError) { if (this.tableColumn && this.tableColumn.editor && this.tableColumn.editor.errorsData) { const error = this.tableColumn.editor.errorsData.find((item) => item.name === oError); return error ? error.text : ''; } else { return ''; } } updateValidators() { ErrorsUtils.updateFormControlValidators(this); } hasError(error) { return this.formControl && this.formControl.touched && (this.hasErrorExclusive(error) || this.formControl.hasError(error)); } hasSomeError() { return this.formControl && this.formControl.touched && Util.isDefined(this.formControl.errors); } hasErrorExclusive(error) { let hasError = false; const errorsOrder = ['matDatepickerMax', 'matDatepickerMin', 'matDatepickerFilter', 'matDatepickerParse', 'required']; const errors = this.formControl.errors; if (Util.isDefined(errors)) { if (Object.keys(errors).length === 1) { return errors.hasOwnProperty(error); } else { for (let i = 0, len = errorsOrder.length; i < len; i++) { hasError = errors.hasOwnProperty(errorsOrder[i]); if (hasError) { hasError = (errorsOrder[i] === error); break; } } } } return hasError; } getErrorValue(error, prop) { return this.formControl.hasError(error) ? this.formControl.getError(error)[prop] ?? '' : ''; } onEscClicked() { if (!this.isSilentControl()) { this.endEdition(false); this.editionCancelled.emit(this._rowData); } } isSilentControl() { return this.controlArgs !== undefined && this.controlArgs.silent; } getPlaceholder() { return this.showPlaceHolder ? this.translateService.get(this.olabel || this.tableColumn ? (this.tableColumn.title || this.tableColumnAttr) : this.tableColumnAttr) : undefined; } onUpdateSuccess(res) { ObservableWrapper.callEmit(this.onPostUpdateRecord, this._rowData); if (this.showNotificationOnEdit) { this.snackBarService.open('MESSAGES.UPDATED', { icon: 'check_circle' }); } } set enabled(arg) { this._enabled = arg; if (this.formControl) { this._enabled ? this.formControl.enable() : this.formControl.disable(); } } get enabled() { return this._enabled; } getFormControl() { return this.formControl; } setEditingRowClass(addClass) { const inputEl = document.getElementById(this.cellEditorId); if (inputEl) { const tableRowEl = inputEl.closest('tr'); if (tableRowEl) { addClass ? this.renderer.addClass(tableRowEl, 'o-table-editing-row') : this.renderer.removeClass(tableRowEl, 'o-table-editing-row'); this.table.cd.detectChanges(); } } } get tooltip() { const liteError = this.errorOptions.type === Codes.O_MAT_ERROR_LITE; return liteError && this.hasSomeError() ? ErrorsUtils.getErrorsTooltipText(this) : ''; } get tooltipClass() { return ErrorsUtils.getTooltipClasses(this); } } OBaseTableCellEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OBaseTableCellEditor, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); OBaseTableCellEditor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: OBaseTableCellEditor, inputs: { orequired: ["required", "orequired"], showPlaceHolder: ["show-placeholder", "showPlaceHolder"], olabel: ["label", "olabel"], updateRecordOnEdit: ["update-record-on-edit", "updateRecordOnEdit"], showNotificationOnEdit: ["show-notification-on-edit", "showNotificationOnEdit"], enabled: "enabled" }, outputs: { editionStarted: "editionStarted", editionCancelled: "editionCancelled", editionCommitted: "editionCommitted", onPostUpdateRecord: "onPostUpdateRecord" }, host: { listeners: { "document:keyup": "onDocumentKeyup($event)" } }, queries: [{ propertyName: "validatorChildren", predicate: OValidatorComponent }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }, { propertyName: "oMatErrorChildren", predicate: OMatErrorDirective, descendants: true }], usesOnChanges: true, ngImport: i0 }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OBaseTableCellEditor.prototype, "orequired", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OBaseTableCellEditor.prototype, "showPlaceHolder", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OBaseTableCellEditor.prototype, "updateRecordOnEdit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OBaseTableCellEditor.prototype, "showNotificationOnEdit", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OBaseTableCellEditor, decorators: [{ type: Directive, args: [{ inputs: DEFAULT_INPUTS_O_TABLE_CELL_EDITOR, outputs: DEFAULT_OUTPUTS_O_TABLE_CELL_EDITOR }] }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { orequired: [], showPlaceHolder: [], updateRecordOnEdit: [], showNotificationOnEdit: [], inputRef: [{ type: ViewChild, args: ['input'] }], validatorChildren: [{ type: ContentChildren, args: [OValidatorComponent] }], onDocumentKeyup: [{ type: HostListener, args: ['document:keyup', ['$event']] }], oMatErrorChildren: [{ type: ViewChildren, args: [OMatErrorDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1iYXNlLXRhYmxlLWNlbGwtZWRpdG9yLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvY29sdW1uL2NlbGwtZWRpdG9yL28tYmFzZS10YWJsZS1jZWxsLWVkaXRvci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFnQyxTQUFTLEVBQUUsU0FBUyxFQUFRLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbk0sT0FBTyxFQUFvQixrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFHckcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBd0MsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZC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Q0FBQztnQkFVMUMsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbnRlbnRDaGlsZHJlbiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0b3IsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNWYWxpZGF0b3JGbiwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBPTWF0RXJyb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmVzL28tbWF0LWVycm9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IE9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlL28tdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1ZhbGlkYXRvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzL3ZhbGlkYXRpb24vby12YWxpZGF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IEVycm9yRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL3R5cGVzL2Vycm9yLWRhdGEudHlwZSc7XG5pbXBvcnQgeyBPTWF0RXJyb3JPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMvby1tYXQtZXJyb3IudHlwZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlV3JhcHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWwvYXN5bmMnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IENvbXBvbmVudFdpdGhWYWxpZGF0b3JzQW5kRXJyb3JzRGF0YSwgRXJyb3JzVXRpbHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsL2Vycm9ycyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9UYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL28tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE9Db2x1bW4gfSBmcm9tICcuLi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRV9DRUxMX0VESVRPUiA9IFtcbiAgJ29yZXF1aXJlZDogcmVxdWlyZWQnLFxuICAnc2hvd1BsYWNlSG9sZGVyOiBzaG93LXBsYWNlaG9sZGVyJyxcbiAgJ29sYWJlbDogbGFiZWwnLFxuICAndXBkYXRlUmVjb3JkT25FZGl0OiB1cGRhdGUtcmVjb3JkLW9uLWVkaXQnLFxuICAnc2hvd05vdGlmaWNhdGlvbk9uRWRpdDogc2hvdy1ub3RpZmljYXRpb24tb24tZWRpdCcsXG4gICdlbmFibGVkJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFX0NFTExfRURJVE9SID0gW1xuICAnZWRpdGlvblN0YXJ0ZWQnLFxuICAnZWRpdGlvbkNhbmNlbGxlZCcsXG4gICdlZGl0aW9uQ29tbWl0dGVkJyxcbiAgJ29uUG9zdFVwZGF0ZVJlY29yZCdcbl07XG5cbkBEaXJlY3RpdmUoe1xuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVEFCTEVfQ0VMTF9FRElUT1IsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFX0NFTExfRURJVE9SXG59KVxuZXhwb3J0IGNsYXNzIE9CYXNlVGFibGVDZWxsRWRpdG9yIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29tcG9uZW50V2l0aFZhbGlkYXRvcnNBbmRFcnJvcnNEYXRhIHtcblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogT1RyYW5zbGF0ZVNlcnZpY2U7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1BsYWNlSG9sZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIG9sYWJlbDogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdXBkYXRlUmVjb3JkT25FZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dOb3RpZmljYXRpb25PbkVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgX2VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBfdGFibGVDb2x1bW46IE9UYWJsZUNvbHVtbjtcbiAgcHJvdGVjdGVkIF90YWJsZTogT1RhYmxlQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCBfcm93RGF0YTogYW55O1xuXG4gIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIGNvbnRyb2xBcmdzOiBhbnk7XG5cbiAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xuXG4gIGVkaXRpb25TdGFydGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICBlZGl0aW9uQ2FuY2VsbGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICBlZGl0aW9uQ29tbWl0dGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuXG4gIG9uUG9zdFVwZGF0ZVJlY29yZDogRXZlbnRFbWl0dGVyPG9iamVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICBwdWJsaWMgZWRpdG9yQ3JlYXRlZDogRXZlbnRFbWl0dGVyPG9iamVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcpXG4gIHByb3RlY3RlZCBpbnB1dFJlZjogYW55O1xuXG4gIHByb3RlY3RlZCB0eXBlOiBzdHJpbmc7XG4gIHJlZ2lzdGVySW5Db2x1bW46IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcbiAgcHJvdGVjdGVkIG9sZFZhbHVlOiBhbnk7XG4gIGNlbGxFZGl0b3JJZDogc3RyaW5nO1xuXG4gIGVycm9yc0RhdGE6IEVycm9yRGF0YVtdID0gW107XG4gIHByb3RlY3RlZCB2YWxpZGF0b3JzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIEBDb250ZW50Q2hpbGRyZW4oT1ZhbGlkYXRvckNvbXBvbmVudClcbiAgdmFsaWRhdG9yQ2hpbGRyZW46IFF1ZXJ5TGlzdDxPVmFsaWRhdG9yQ29tcG9uZW50PjtcbiAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRLZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMuaGFuZGxlS2V5dXAoZXZlbnQpO1xuICB9XG5cbiAgdG9vbHRpcFBvc2l0aW9uOiBzdHJpbmcgPSAnYmVsb3cnO1xuICB0b29sdGlwU2hvd0RlbGF5OiBudW1iZXIgPSA1MDA7XG4gIHRvb2x0aXBIaWRlRGVsYXk6IG51bWJlciA9IDA7XG4gIGVycm9yT3B0aW9uczogT01hdEVycm9yT3B0aW9ucztcbiAgQFZpZXdDaGlsZHJlbihPTWF0RXJyb3JEaXJlY3RpdmUpXG4gIG9NYXRFcnJvckNoaWxkcmVuOiBRdWVyeUxpc3Q8T01hdEVycm9yRGlyZWN0aXZlPjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxTbmFja0JhclNlcnZpY2U+KFNuYWNrQmFyU2VydmljZSBhcyBUeXBlPFNuYWNrQmFyU2VydmljZT4pO1xuICAgIHRoaXMudGFibGVDb2x1bW4gPSB0aGlzLmluamVjdG9yLmdldDxPVGFibGVDb2x1bW5Db21wb25lbnQ+KE9UYWJsZUNvbHVtbkNvbXBvbmVudCBhcyBUeXBlPE9UYWJsZUNvbHVtbkNvbXBvbmVudD4pO1xuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PE9UcmFuc2xhdGVTZXJ2aWNlPihPVHJhbnNsYXRlU2VydmljZSBhcyBUeXBlPE9UcmFuc2xhdGVTZXJ2aWNlPik7XG4gICAgdGhpcy5jZWxsRWRpdG9ySWQgPSBVdGlsLnJhbmRvbU51bWJlcigpLnRvU3RyaW5nKDM2KTtcbiAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5pbmplY3Rvci5nZXQ8UmVuZGVyZXIyPihSZW5kZXJlcjIgYXMgVHlwZTxSZW5kZXJlcjI+KTtcbiAgICB0aGlzLmVycm9yT3B0aW9ucyA9IEVycm9yc1V0aWxzLmdldEVycm9yT3B0aW9ucyh0aGlzLmluamVjdG9yKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsaWRhdG9yQ2hpbGRyZW4pIHtcbiAgICAgIHRoaXMudmFsaWRhdG9yc1N1YnNjcmlwdGlvbiA9IHRoaXMudmFsaWRhdG9yQ2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRvcnMoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMudmFsaWRhdG9yQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRvcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodm9pZCAwKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNlbGwgZWRpdG9yXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKCk7XG4gICAgdGhpcy5yZWdpc3RlckVkaXRvcigpO1xuICAgIHRoaXMuZWRpdG9yQ3JlYXRlZC5lbWl0KHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3Qgb0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLnRhYmxlQ29sdW1uQXR0cik7XG4gICAgaWYgKCFvQ29sdW1uIHx8ICFvQ29sdW1uLmVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXNjQ2xpY2tlZCA9IHRoaXMuY2hlY2tLZXkoZXZlbnQsICdFc2NhcGUnLCAyNyk7XG4gICAgY29uc3QgZW50ZXJDbGlja2VkID0gdGhpcy5jaGVja0tleShldmVudCwgJ0VudGVyJywgMTMpO1xuICAgIGNvbnN0IHRhYkNsaWNrZWQgPSB0aGlzLmNoZWNrS2V5KGV2ZW50LCAnVGFiJywgOSk7XG4gICAgaWYgKCFlc2NDbGlja2VkICYmICFlbnRlckNsaWNrZWQgJiYgIXRhYkNsaWNrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXNjQ2xpY2tlZCkge1xuICAgICAgdGhpcy5vbkVzY0NsaWNrZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZS5lZGl0aW5nQ2VsbCAmJiAhdGhpcy50YWJsZS5lZGl0aW5nQ2VsbC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVudGVyQ2xpY2tlZCB8fCB0YWJDbGlja2VkKSB7XG4gICAgICB0aGlzLmNvbW1pdEVkaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGtleTogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LmtleSAmJiBldmVudC5rZXkgPT09IGtleSkgfHwgKGV2ZW50LmtleUNvZGUgJiYgZXZlbnQua2V5Q29kZSA9PT0ga2V5Q29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBmb3JtIGNvbnRyb2xcbiAgICovXG4gIGNyZWF0ZUZvcm1Db250cm9sKCkge1xuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IHRoaXMucmVzb2x2ZVZhbGlkYXRvcnMoKTtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JGbltdID0gdGhpcy5yZXNvbHZlQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICBjb25zdCBjZmcgPSB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5lbmFibGVkXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChjZmcsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICB9XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLmZvcm1Hcm91cC5nZXQodGhpcy5jZWxsRWRpdG9ySWQpKSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbCh0aGlzLmNlbGxFZGl0b3JJZCwgdGhpcy5mb3JtQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBlZGl0b3JcbiAgICovXG4gIHJlZ2lzdGVyRWRpdG9yKCkge1xuICAgIGlmICh0aGlzLnJlZ2lzdGVySW5Db2x1bW4gJiYgIVV0aWwuaXNEZWZpbmVkKHRoaXMudGFibGVDb2x1bW4uZWRpdG9yKSkge1xuICAgICAgdGhpcy50YWJsZUNvbHVtbi5yZWdpc3RlckVkaXRvcih0aGlzKTtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy50eXBlKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlQ29sdW1uLnR5cGUpKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMudGFibGVDb2x1bW4udHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgZGF0YVxuICAgKiBAcmV0dXJucyBjZWxsIGRhdGFcbiAgICovXG4gIGdldENlbGxEYXRhKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd0RhdGFbdGhpcy50YWJsZUNvbHVtbkF0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGVkaXRpb24gd2l0aCBnaXZlbiB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgc3RhcnRFZGl0aW9uKGRhdGE6IGFueSkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnJlc2V0KCk7XG4gICAgdGhpcy5yb3dEYXRhID0gZGF0YTtcbiAgICBpZiAoIXRoaXMuaXNTaWxlbnRDb250cm9sKCkpIHtcbiAgICAgIHRoaXMuZWRpdGlvblN0YXJ0ZWQuZW1pdCh0aGlzLl9yb3dEYXRhKTtcbiAgICB9XG4gICAgdGhpcy50YWJsZS5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyBTZWxlY3RpbmcgdGV4dCBpZiB0aGUgdGVtcGxhdGUgaW5wdXQgZWxlbWVudCBoYXMgZGVmaW5lZCB0aGUgaWQ9Y2VsbEVkaXRvcklkXG4gICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2VsbEVkaXRvcklkKTtcbiAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgKGlucHV0RWwgYXMgSFRNTElucHV0RWxlbWVudCkuc2VsZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuc2V0RWRpdGluZ1Jvd0NsYXNzKHRydWUpXG4gIH1cblxuICAvKipcbiAgICogRW5kcyBlZGl0aW9uIHdpdGggdGhlIGFiaWxpdHkgdG8gc2tpcCBvciBzYXZlIGNoYW5nZXNcbiAgICogQHBhcmFtIHNhdmVDaGFuZ2VzXG4gICAqL1xuICBlbmRFZGl0aW9uKHNhdmVDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb0NvbHVtbjogT0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLnRhYmxlQ29sdW1uQXR0cik7XG4gICAgaWYgKG9Db2x1bW4pIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9ic2VydmVyID0gdGhpcy50YWJsZS51cGRhdGVDZWxsRGF0YShvQ29sdW1uLCB0aGlzLl9yb3dEYXRhLCBzYXZlQ2hhbmdlcyk7XG4gICAgICBpZiAodXBkYXRlT2JzZXJ2ZXIpIHtcbiAgICAgICAgdXBkYXRlT2JzZXJ2ZXIuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5vblVwZGF0ZVN1Y2Nlc3MocmVzKTtcbiAgICAgICAgICB0aGlzLnRhYmxlLmRhb1RhYmxlLnNldERhdGFBcnJheSh0aGlzLnRhYmxlLmRhb1RhYmxlLmRhdGEpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5fcm93RGF0YVt0aGlzLnRhYmxlQ29sdW1uQXR0cl0gPSB0aGlzLm9sZFZhbHVlO1xuICAgICAgICAgIHRoaXMudGFibGUuZGF0YVNvdXJjZS51cGRhdGVSZW5kZXJlZFJvd0RhdGEodGhpcy5fcm93RGF0YSk7XG4gICAgICAgICAgdGhpcy50YWJsZS5zaG93RGlhbG9nRXJyb3IoZXJyb3IsICdNRVNTQUdFUy5FUlJPUl9VUERBVEUnKTtcbiAgICAgICAgICB0aGlzLnRhYmxlLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlLnNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDb21taXRzIGVkaXRpb25cbiAgICovXG4gIGNvbW1pdEVkaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sLmludmFsaWQpIHtcbiAgICAgIHRoaXMub2xkVmFsdWUgPSB0aGlzLl9yb3dEYXRhW3RoaXMudGFibGVDb2x1bW5BdHRyXTtcbiAgICAgIHRoaXMuX3Jvd0RhdGFbdGhpcy50YWJsZUNvbHVtbkF0dHJdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgIGlmICghdGhpcy5pc1NpbGVudENvbnRyb2woKSkge1xuICAgICAgICB0aGlzLmVuZEVkaXRpb24odHJ1ZSk7XG4gICAgICAgIHRoaXMuZWRpdGlvbkNvbW1pdHRlZC5lbWl0KHRoaXMuX3Jvd0RhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUNvbHVtbigpOiBPVGFibGVDb2x1bW4ge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUNvbHVtbjtcbiAgfVxuXG4gIHNldCB0YWJsZUNvbHVtbihhcmc6IE9UYWJsZUNvbHVtbikge1xuICAgIHRoaXMuX3RhYmxlQ29sdW1uID0gYXJnO1xuICAgIGlmIChhcmcpIHtcbiAgICAgIHRoaXMuX3RhYmxlID0gYXJnLnRhYmxlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJsZUNvbHVtbkF0dHIoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdGFibGVDb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLl90YWJsZUNvbHVtbi5hdHRyO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgc2V0IHRhYmxlKGFyZzogT1RhYmxlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5fdGFibGUgPSBhcmc7XG4gIH1cblxuICBnZXQgdGFibGUoKTogT1RhYmxlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGU7XG4gIH1cblxuICBnZXQgcm93RGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9yb3dEYXRhO1xuICB9XG5cbiAgc2V0IHJvd0RhdGEoYXJnOiBhbnkpIHtcbiAgICB0aGlzLl9yb3dEYXRhID0gYXJnO1xuICAgIGNvbnN0IGNlbGxEYXRhID0gdGhpcy5nZXRDZWxsRGF0YSgpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoY2VsbERhdGEpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICB9XG5cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdmFsaWRhdG9yc1xuICAgKiBAcmV0dXJucyB2YWxpZGF0b3JzXG4gICAqL1xuICByZXNvbHZlVmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XG4gICAgaWYgKHRoaXMudGFibGVDb2x1bW4uYW5ndWxhclZhbGlkYXRvcnNGbiAmJiB0aGlzLnRhYmxlQ29sdW1uLmFuZ3VsYXJWYWxpZGF0b3JzRm4ubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKC4uLnRoaXMudGFibGVDb2x1bW4uYW5ndWxhclZhbGlkYXRvcnNGbik7XG4gICAgICBFcnJvcnNVdGlscy5wdXNoVG9FcnJvcnNEYXRhKHRoaXMsIHRoaXMudGFibGVDb2x1bW4uYW5ndWxhclZhbGlkYXRvcnNGbkVycm9ycyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9yZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIHJlc29sdmVBc3luY1ZhbGlkYXRvcnMoKTogQXN5bmNWYWxpZGF0b3JGbltdIHtcbiAgICBpZiAodGhpcy50YWJsZUNvbHVtbi5hbmd1bGFyQXN5bmNWYWxpZGF0b3JzRm4gJiYgdGhpcy50YWJsZUNvbHVtbi5hbmd1bGFyQXN5bmNWYWxpZGF0b3JzRm4ubGVuZ3RoID4gMCkge1xuICAgICAgRXJyb3JzVXRpbHMucHVzaFRvRXJyb3JzRGF0YSh0aGlzLCB0aGlzLnRhYmxlQ29sdW1uLmFuZ3VsYXJWYWxpZGF0b3JzRm5FcnJvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWJsZUNvbHVtbi5hbmd1bGFyQXN5bmNWYWxpZGF0b3JzRm4gfHwgW11cbiAgfVxuXG4gIGdldEFjdGl2ZU9FcnJvcnMoKSB7XG4gICAgcmV0dXJuIEVycm9yc1V0aWxzLmdldEFjdGl2ZU9FcnJvcnModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JUZXh0KG9FcnJvcjogYW55KSB7XG4gICAgaWYgKHRoaXMudGFibGVDb2x1bW4gJiYgdGhpcy50YWJsZUNvbHVtbi5lZGl0b3IgJiYgdGhpcy50YWJsZUNvbHVtbi5lZGl0b3IuZXJyb3JzRGF0YSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnRhYmxlQ29sdW1uLmVkaXRvci5lcnJvcnNEYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gb0Vycm9yKTtcbiAgICAgIHJldHVybiBlcnJvciA/IGVycm9yLnRleHQgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgIEVycm9yc1V0aWxzLnVwZGF0ZUZvcm1Db250cm9sVmFsaWRhdG9ycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgZXJyb3IgaGFzXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGVycm9yXG4gICAqL1xuICBoYXNFcnJvcihlcnJvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wgJiYgdGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmICh0aGlzLmhhc0Vycm9yRXhjbHVzaXZlKGVycm9yKSB8fCB0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKGVycm9yKSk7XG4gIH1cblxuICBoYXNTb21lRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wgJiYgdGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzKTtcbiAgfVxuXG4gIGhhc0Vycm9yRXhjbHVzaXZlKGVycm9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCBlcnJvcnNPcmRlciA9IFsnbWF0RGF0ZXBpY2tlck1heCcsICdtYXREYXRlcGlja2VyTWluJywgJ21hdERhdGVwaWNrZXJGaWx0ZXInLCAnbWF0RGF0ZXBpY2tlclBhcnNlJywgJ3JlcXVpcmVkJ107XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtQ29udHJvbC5lcnJvcnM7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGVycm9ycykpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZXJyb3JzLmhhc093blByb3BlcnR5KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBlcnJvcnNPcmRlci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGhhc0Vycm9yID0gZXJyb3JzLmhhc093blByb3BlcnR5KGVycm9yc09yZGVyW2ldKTtcbiAgICAgICAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgICAgIGhhc0Vycm9yID0gKGVycm9yc09yZGVyW2ldID09PSBlcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG5cbiAgZ2V0RXJyb3JWYWx1ZShlcnJvcjogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKGVycm9yKSA/IHRoaXMuZm9ybUNvbnRyb2wuZ2V0RXJyb3IoZXJyb3IpW3Byb3BdID8/ICcnIDogJyc7XG4gIH1cblxuICBvbkVzY0NsaWNrZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2lsZW50Q29udHJvbCgpKSB7XG4gICAgICB0aGlzLmVuZEVkaXRpb24oZmFsc2UpO1xuICAgICAgdGhpcy5lZGl0aW9uQ2FuY2VsbGVkLmVtaXQodGhpcy5fcm93RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzU2lsZW50Q29udHJvbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sQXJncyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29udHJvbEFyZ3Muc2lsZW50O1xuICB9XG5cbiAgZ2V0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UGxhY2VIb2xkZXIgP1xuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0aGlzLm9sYWJlbCB8fCB0aGlzLnRhYmxlQ29sdW1uID8gKHRoaXMudGFibGVDb2x1bW4udGl0bGUgfHwgdGhpcy50YWJsZUNvbHVtbkF0dHIpIDogdGhpcy50YWJsZUNvbHVtbkF0dHIpIDpcbiAgICAgIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblVwZGF0ZVN1Y2Nlc3MocmVzOiBhbnkpIHtcbiAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUG9zdFVwZGF0ZVJlY29yZCwgdGhpcy5fcm93RGF0YSk7XG4gICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9uRWRpdCkge1xuICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuVVBEQVRFRCcsIHsgaWNvbjogJ2NoZWNrX2NpcmNsZScgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0IGVuYWJsZWQoYXJnOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IGFyZztcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgdGhpcy5fZW5hYmxlZCA/IHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlKCkgOiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIGdldEZvcm1Db250cm9sKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sO1xuICB9XG5cbiAgc2V0RWRpdGluZ1Jvd0NsYXNzKGFkZENsYXNzOiBib29sZWFuKSB7XG4gICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2VsbEVkaXRvcklkKTtcbiAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgY29uc3QgdGFibGVSb3dFbCA9IGlucHV0RWwuY2xvc2VzdCgndHInKTtcbiAgICAgIGlmICh0YWJsZVJvd0VsKSB7XG4gICAgICAgIGFkZENsYXNzID8gdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0YWJsZVJvd0VsLCAnby10YWJsZS1lZGl0aW5nLXJvdycpIDpcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRhYmxlUm93RWwsICdvLXRhYmxlLWVkaXRpbmctcm93JylcbiAgICAgICAgdGhpcy50YWJsZS5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaXRlRXJyb3IgPSB0aGlzLmVycm9yT3B0aW9ucy50eXBlID09PSBDb2Rlcy5PX01BVF9FUlJPUl9MSVRFO1xuICAgIHJldHVybiBsaXRlRXJyb3IgJiYgdGhpcy5oYXNTb21lRXJyb3IoKSA/IEVycm9yc1V0aWxzLmdldEVycm9yc1Rvb2x0aXBUZXh0KHRoaXMpIDogJyc7XG4gIH1cblxuICBnZXQgdG9vbHRpcENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVycm9yc1V0aWxzLmdldFRvb2x0aXBDbGFzc2VzKHRoaXMpO1xuICB9XG59XG4iXX0=