UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

202 lines (200 loc) 30.1 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, Input, ViewChild, Self, Optional, } from '@angular/core'; import { NgModel } from '@angular/forms'; import { ValueAccessorBase } from '../input/core/value-accessor'; import { InputMask } from '../input/core/input-mask'; import { ReverseFormatDate } from '../core/helper/reverseformatdate'; import { TlLeftPadPipe } from '../internals/pipes/leftpad.pipe'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "../internals/components/label/label"; import * as i4 from "./directives/date.directive"; export class TlDate extends ValueAccessorBase { constructor(renderer, change, ngControl) { super(); this.renderer = renderer; this.change = change; this.ngControl = ngControl; this.formatDate = 'dd/mm/yyyy'; this.isoDate = false; this.label = 'Label'; this.labelSize = '100px'; this.disabled = false; this.required = false; this.readonly = false; this.color = 'basic'; this.withBorder = true; this.flatBorders = false; this.labelPlacement = 'left'; this.subscription = new Subscription(); this.setControl(); } get control() { return this.ngControl?.control; } setControl() { if (this.ngControl) { this.ngControl.valueAccessor = this; } } ngAfterViewInit() { this.setDateMask(); this.fieldMask = new InputMask(this, this.renderer, this.mask); this.getMockValue(this.value); this.handleModelChangeInit(); this.handleChangeStatus(); this.handleRequiredValidator(); this.handleCompleteMask(); this.change.detectChanges(); } handleCompleteMask() { this.subscription.add(this.fieldMask.complete.subscribe(() => { if (this.isoDate) { this.handleIsoDateModel(); } })); } handleChangeStatus() { this.subscription.add(this.hiddenModel.statusChanges.subscribe((value) => { value === 'VALID' ? this.ngControl.control.setErrors(null) : this.ngControl.control.setErrors(this.hiddenModel.control.errors); })); } handleModelChangeInit() { if (this.ngControl) { this.ngControl.valueChanges.subscribe((value) => { this.getMockValue(value); }); } } handleRequiredValidator() { if (this.ngControl.control.validator) { let validators = [this.hiddenModel.control.validator]; validators = [...validators, this.ngControl.control.validator]; this.hiddenModel.control.setValidators(validators); } if (this.ngControl.control && this.ngControl.control.errors && this.ngControl.control.errors.hasOwnProperty('required')) { this.required = this.ngControl.control.errors['required']; } } getMockValue(value) { if (!value) { this.value = null; return; } if (this.isoDate && value.length > 0) { const date = new Date(value); this.mockValue = this.getDateByFormat(date); return; } this.mockValue = value; } getDateByFormat(date) { let formattedDate; const leftPad = new TlLeftPadPipe(); const first = this.formatDate.replace('dd', leftPad.transform(date.getDate(), 2)); const second = first.replace('mm', leftPad.transform(date.getMonth() + 1, 2)); formattedDate = second.replace('yyyy', leftPad.transform(date.getFullYear(), 4)); return formattedDate; } isIsoDate(str) { if (!/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(str)) { return false; } const d = new Date(str); return d.toISOString() === str; } handleIsoDateModel() { setTimeout(() => { if (this.value.length === 0 && this.isControlValid()) { this.value = null; return; } if (!this.isIsoDate(this.value)) { const date = ReverseFormatDate(this.value, this.formatDate); const parsed = Date.parse(date.stringFormat); if (!isNaN(parsed)) { this.value = new Date(date.year, date.month - 1, date.day).toISOString(); } } this.propagateTouched(); }, 100); } isControlValid() { return this.hiddenModel.valid; } setDateMask() { const formatTmp = this.formatDate.replace(/[a-z]/gi, ''); const formatArray = this.formatDate.split(''); for (let i = 0; i < formatArray.length; i++) { if (formatArray[i] !== formatTmp[0]) { formatArray[i] = '0'; } } this.mask = formatArray.toString().replace(/,/gi, ''); this.placeholder = this.formatDate.toUpperCase(); this.change.detectChanges(); } ngOnDestroy() { this.subscription.unsubscribe(); } } /** @nocollapse */ TlDate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlDate, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlDate.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlDate, selector: "tl-date", inputs: { formatDate: "formatDate", isoDate: "isoDate", label: "label", labelSize: "labelSize", disabled: "disabled", required: "required", readonly: "readonly", color: "color", withBorder: "withBorder", flatBorders: "flatBorders", labelPlacement: "labelPlacement" }, viewQueries: [{ propertyName: "hiddenModel", first: true, predicate: NgModel, descendants: true, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [class]=\"'ui-wrapper-date ' + color\">\n <tl-label [required]=\"required\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div class=\"ui-input-wrapper\">\n <input #input\n class=\"ui-input-date\"\n [placeholder]=\"placeholder\"\n (focus)=\"touched = true\"\n [ngClass]=\"{\n 'withBorder': withBorder,\n 'withoutBorder' : !withBorder,\n 'ng-touched': touched,\n 'ng-valid': hiddenModel?.valid,\n 'ng-invalid': hiddenModel?.invalid,\n 'ng-dirty': hiddenModel?.dirty,\n 'flatBorders': flatBorders\n }\"\n [attr.disabled]=\"disabled ? true : null\"\n [attr.readonly]=\"readonly ? true : null\"\n [attr.value]=\"mockValue\">\n <input [formatDate]=\"formatDate\"\n [isoDate]=\"isoDate\"\n [(ngModel)]=\"value\"\n date\n notform\n class=\"ui-input\"\n type=\"text\">\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.ui-wrapper-date{display:table}.ui-input-wrapper{display:table-cell;width:100%}.ui-input-date{width:100%;height:25px;padding:0 5px;border-radius:3px;font-size:12px;font-weight:400;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.ui-input-date.flatBorders{border-radius:0}.ui-input{visibility:hidden;position:absolute;left:0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.TlLabel, selector: "tl-label", inputs: ["labelPlacement", "required", "labelSize", "labelTitle"] }, { kind: "directive", type: i4.DateDirective, selector: "[date][ngModel],[date][formControl],[date][formControlName]", inputs: ["formatDate", "isoDate", "control"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlDate, decorators: [{ type: Component, args: [{ selector: 'tl-date', template: "<div [class]=\"'ui-wrapper-date ' + color\">\n <tl-label [required]=\"required\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div class=\"ui-input-wrapper\">\n <input #input\n class=\"ui-input-date\"\n [placeholder]=\"placeholder\"\n (focus)=\"touched = true\"\n [ngClass]=\"{\n 'withBorder': withBorder,\n 'withoutBorder' : !withBorder,\n 'ng-touched': touched,\n 'ng-valid': hiddenModel?.valid,\n 'ng-invalid': hiddenModel?.invalid,\n 'ng-dirty': hiddenModel?.dirty,\n 'flatBorders': flatBorders\n }\"\n [attr.disabled]=\"disabled ? true : null\"\n [attr.readonly]=\"readonly ? true : null\"\n [attr.value]=\"mockValue\">\n <input [formatDate]=\"formatDate\"\n [isoDate]=\"isoDate\"\n [(ngModel)]=\"value\"\n date\n notform\n class=\"ui-input\"\n type=\"text\">\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.ui-wrapper-date{display:table}.ui-input-wrapper{display:table-cell;width:100%}.ui-input-date{width:100%;height:25px;padding:0 5px;border-radius:3px;font-size:12px;font-weight:400;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.ui-input-date.flatBorders{border-radius:0}.ui-input{visibility:hidden;position:absolute;left:0}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{ type: Optional }, { type: Self }] }]; }, propDecorators: { formatDate: [{ type: Input }], isoDate: [{ type: Input }], label: [{ type: Input }], labelSize: [{ type: Input }], disabled: [{ type: Input }], required: [{ type: Input }], readonly: [{ type: Input }], color: [{ type: Input }], withBorder: [{ type: Input }], flatBorders: [{ type: Input }], labelPlacement: [{ type: Input }], hiddenModel: [{ type: ViewChild, args: [NgModel, { static: true }] }], input: [{ type: ViewChild, args: ['input', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2RhdGUvZGF0ZS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2RhdGUvZGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUF5QixTQUFTLEVBQ0wsSUFBSSxFQUFFLFFBQVEsR0FDNUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFhLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBT3BDLE1BQU0sT0FBTyxNQUFPLFNBQVEsaUJBQXlCO0lBd0NuRCxZQUFxQixRQUFtQixFQUNuQixNQUF5QixFQUNOLFNBQW9CO1FBQzFELEtBQUssRUFBRSxDQUFDO1FBSFcsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUNOLGNBQVMsR0FBVCxTQUFTLENBQVc7UUF4Q25ELGVBQVUsR0FBRyxZQUFZLENBQUM7UUFFMUIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRWhCLGNBQVMsR0FBRyxPQUFPLENBQUM7UUFFcEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixhQUFRLEdBQUcs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Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRWlDLFdBQVc7c0JBQWpELFNBQVM7dUJBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFSSxLQUFLO3NCQUEzQyxTQUFTO3VCQUFFLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsXG4gIENoYW5nZURldGVjdG9yUmVmLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFNlbGYsIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbHVlQWNjZXNzb3JCYXNlIH0gZnJvbSAnLi4vaW5wdXQvY29yZS92YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBJbnB1dE1hc2sgfSBmcm9tICcuLi9pbnB1dC9jb3JlL2lucHV0LW1hc2snO1xuaW1wb3J0IHsgUmV2ZXJzZUZvcm1hdERhdGUgfSBmcm9tICcuLi9jb3JlL2hlbHBlci9yZXZlcnNlZm9ybWF0ZGF0ZSc7XG5pbXBvcnQgeyBUbExlZnRQYWRQaXBlIH0gZnJvbSAnLi4vaW50ZXJuYWxzL3BpcGVzL2xlZnRwYWQucGlwZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLWRhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL2RhdGUuc2NzcycgXVxufSApXG5leHBvcnQgY2xhc3MgVGxEYXRlIGV4dGVuZHMgVmFsdWVBY2Nlc3NvckJhc2U8c3RyaW5nPiBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgZm9ybWF0RGF0ZSA9ICdkZC9tbS95eXl5JztcblxuICBASW5wdXQoKSBpc29EYXRlID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGFiZWwgPSAnTGFiZWwnO1xuXG4gIEBJbnB1dCgpIGxhYmVsU2l6ZSA9ICcxMDBweCc7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQElucHV0KCkgY29sb3IgPSAnYmFzaWMnO1xuXG4gIEBJbnB1dCgpIHdpdGhCb3JkZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGZsYXRCb3JkZXJzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGFiZWxQbGFjZW1lbnQ6ICdsZWZ0JyB8ICd0b3AnID0gJ2xlZnQnO1xuXG4gIEBWaWV3Q2hpbGQoIE5nTW9kZWwsIHtzdGF0aWM6IHRydWV9ICApIGhpZGRlbk1vZGVsOiBOZ01vZGVsO1xuXG4gIEBWaWV3Q2hpbGQoICdpbnB1dCcsIHtzdGF0aWM6IHRydWV9ICApIGlucHV0OiBFbGVtZW50UmVmO1xuXG4gIHB1YmxpYyBtb2NrVmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGZpZWxkTWFzazogSW5wdXRNYXNrO1xuXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIHB1YmxpYyB0b3VjaGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbWFzazogc3RyaW5nO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZTogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2V0Q29udHJvbCgpO1xuICB9XG5cbiAgZ2V0IGNvbnRyb2woKSB7XG4gICAgcmV0dXJuIHRoaXMubmdDb250cm9sPy5jb250cm9sO1xuICB9XG5cbiAgc2V0Q29udHJvbCgpIHtcbiAgICBpZiAoIHRoaXMubmdDb250cm9sICkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0RGF0ZU1hc2soKTtcbiAgICB0aGlzLmZpZWxkTWFzayA9IG5ldyBJbnB1dE1hc2soIHRoaXMsIHRoaXMucmVuZGVyZXIsIHRoaXMubWFzayApO1xuICAgIHRoaXMuZ2V0TW9ja1ZhbHVlKCB0aGlzLnZhbHVlICk7XG4gICAgdGhpcy5oYW5kbGVNb2RlbENoYW5nZUluaXQoKTtcbiAgICB0aGlzLmhhbmRsZUNoYW5nZVN0YXR1cygpO1xuICAgIHRoaXMuaGFuZGxlUmVxdWlyZWRWYWxpZGF0b3IoKTtcbiAgICB0aGlzLmhhbmRsZUNvbXBsZXRlTWFzaygpO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGhhbmRsZUNvbXBsZXRlTWFzaygpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5maWVsZE1hc2suY29tcGxldGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICggdGhpcy5pc29EYXRlICkge1xuICAgICAgICB0aGlzLmhhbmRsZUlzb0RhdGVNb2RlbCgpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIGhhbmRsZUNoYW5nZVN0YXR1cygpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5oaWRkZW5Nb2RlbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHZhbHVlID09PSAnVkFMSUQnID8gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRFcnJvcnMobnVsbCkgOlxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnNldEVycm9ycyh0aGlzLmhpZGRlbk1vZGVsLmNvbnRyb2wuZXJyb3JzKTtcbiAgICB9KSk7XG4gIH1cblxuICBoYW5kbGVNb2RlbENoYW5nZUluaXQoKSB7XG4gICAgaWYgKCB0aGlzLm5nQ29udHJvbCApIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoICggdmFsdWUgKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0TW9ja1ZhbHVlKCB2YWx1ZSApO1xuICAgICAgfSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVJlcXVpcmVkVmFsaWRhdG9yKCkge1xuICAgIGlmICggdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IgKSB7XG4gICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbIHRoaXMuaGlkZGVuTW9kZWwuY29udHJvbC52YWxpZGF0b3IgXTtcbiAgICAgICB2YWxpZGF0b3JzID0gWyAuLi52YWxpZGF0b3JzLCB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciBdO1xuICAgICAgIHRoaXMuaGlkZGVuTW9kZWwuY29udHJvbC5zZXRWYWxpZGF0b3JzKCB2YWxpZGF0b3JzICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm5nQ29udHJvbC5jb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZXJyb3JzICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZXJyb3JzLmhhc093blByb3BlcnR5KCdyZXF1aXJlZCcpKSB7XG4gICAgICB0aGlzLnJlcXVpcmVkID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5lcnJvcnNbJ3JlcXVpcmVkJ107XG4gICAgfVxuICB9XG5cbiAgZ2V0TW9ja1ZhbHVlKCB2YWx1ZSApIHtcbiAgICBpZiAoICF2YWx1ZSApIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIHRoaXMuaXNvRGF0ZSAmJiB2YWx1ZS5sZW5ndGggPiAwICkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCB2YWx1ZSApO1xuICAgICAgdGhpcy5tb2NrVmFsdWUgPSB0aGlzLmdldERhdGVCeUZvcm1hdCggZGF0ZSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vY2tWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0RGF0ZUJ5Rm9ybWF0KCBkYXRlICkge1xuICAgIGxldCBmb3JtYXR0ZWREYXRlO1xuICAgIGNvbnN0IGxlZnRQYWQgPSBuZXcgVGxMZWZ0UGFkUGlwZSgpO1xuXG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLmZvcm1hdERhdGUucmVwbGFjZSggJ2RkJywgbGVmdFBhZC50cmFuc2Zvcm0oIGRhdGUuZ2V0RGF0ZSgpLCAyICkgKTtcbiAgICBjb25zdCBzZWNvbmQgPSBmaXJzdC5yZXBsYWNlKCAnbW0nLCBsZWZ0UGFkLnRyYW5zZm9ybSggZGF0ZS5nZXRNb250aCgpICsgMSwgMiApICk7XG4gICAgZm9ybWF0dGVkRGF0ZSA9IHNlY29uZC5yZXBsYWNlKCAneXl5eScsIGxlZnRQYWQudHJhbnNmb3JtKCBkYXRlLmdldEZ1bGxZZWFyKCksIDQgKSApO1xuXG4gICAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG4gIH1cblxuICBpc0lzb0RhdGUoIHN0ciApIHtcbiAgICBpZiAoICEvXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9Wi8udGVzdCggc3RyICkgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSggc3RyICk7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKSA9PT0gc3RyO1xuICB9XG5cbiAgaGFuZGxlSXNvRGF0ZU1vZGVsKCkge1xuICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIGlmICggdGhpcy52YWx1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0NvbnRyb2xWYWxpZCgpICkge1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCAhdGhpcy5pc0lzb0RhdGUoIHRoaXMudmFsdWUgKSApIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IFJldmVyc2VGb3JtYXREYXRlKCB0aGlzLnZhbHVlLCB0aGlzLmZvcm1hdERhdGUgKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSggZGF0ZS5zdHJpbmdGb3JtYXQgKTtcbiAgICAgICAgaWYgKCAhaXNOYU4ocGFyc2VkKSApIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3IERhdGUoIGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5ICkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wYWdhdGVUb3VjaGVkKCk7XG4gICAgfSwgMTAwICk7XG4gIH1cblxuICBpc0NvbnRyb2xWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5oaWRkZW5Nb2RlbC52YWxpZDtcbiAgfVxuXG4gIHNldERhdGVNYXNrKCkge1xuICAgIGNvbnN0IGZvcm1hdFRtcCA9IHRoaXMuZm9ybWF0RGF0ZS5yZXBsYWNlKCAvW2Etel0vZ2ksICcnICk7XG4gICAgY29uc3QgZm9ybWF0QXJyYXkgPSB0aGlzLmZvcm1hdERhdGUuc3BsaXQoICcnICk7XG5cbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBmb3JtYXRBcnJheS5sZW5ndGg7IGkrKyApIHtcbiAgICAgIGlmICggZm9ybWF0QXJyYXlbIGkgXSAhPT0gZm9ybWF0VG1wWyAwIF0gKSB7XG4gICAgICAgIGZvcm1hdEFycmF5WyBpIF0gPSAnMCc7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWFzayA9IGZvcm1hdEFycmF5LnRvU3RyaW5nKCkucmVwbGFjZSggLywvZ2ksICcnICk7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMuZm9ybWF0RGF0ZS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMuY2hhbmdlLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBbY2xhc3NdPVwiJ3VpLXdyYXBwZXItZGF0ZSAnICsgY29sb3JcIj5cbiAgPHRsLWxhYmVsIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtsYWJlbFRpdGxlXT1cImxhYmVsXCIgW2xhYmVsU2l6ZV09XCJsYWJlbFNpemVcIiBbbGFiZWxQbGFjZW1lbnRdPVwibGFiZWxQbGFjZW1lbnRcIj48L3RsLWxhYmVsPlxuICA8ZGl2IGNsYXNzPVwidWktaW5wdXQtd3JhcHBlclwiPlxuICAgIDxpbnB1dCAjaW5wdXRcbiAgICAgICAgICAgY2xhc3M9XCJ1aS1pbnB1dC1kYXRlXCJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgKGZvY3VzKT1cInRvdWNoZWQgPSB0cnVlXCJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICd3aXRoQm9yZGVyJzogd2l0aEJvcmRlcixcbiAgICAgICAgICAgICAnd2l0aG91dEJvcmRlcicgOiAhd2l0aEJvcmRlcixcbiAgICAgICAgICAgICAnbmctdG91Y2hlZCc6IHRvdWNoZWQsXG4gICAgICAgICAgICAgJ25nLXZhbGlkJzogaGlkZGVuTW9kZWw/LnZhbGlkLFxuICAgICAgICAgICAgICduZy1pbnZhbGlkJzogaGlkZGVuTW9kZWw/LmludmFsaWQsXG4gICAgICAgICAgICAgJ25nLWRpcnR5JzogaGlkZGVuTW9kZWw/LmRpcnR5LFxuICAgICAgICAgICAgICdmbGF0Qm9yZGVycyc6IGZsYXRCb3JkZXJzXG4gICAgICAgICAgIH1cIlxuICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgIFthdHRyLnZhbHVlXT1cIm1vY2tWYWx1ZVwiPlxuICAgIDxpbnB1dCBbZm9ybWF0RGF0ZV09XCJmb3JtYXREYXRlXCJcbiAgICAgICAgICAgW2lzb0RhdGVdPVwiaXNvRGF0ZVwiXG4gICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICAgICBkYXRlXG4gICAgICAgICAgIG5vdGZvcm1cbiAgICAgICAgICAgY2xhc3M9XCJ1aS1pbnB1dFwiXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=