UNPKG

@vraj.patel/viitorcloud-ng-utility-library-test-9

Version:

The **ViitorCloud NG Utility Library** developed with the Angular 16 framework, stands out for its exceptional adaptability and reusability within Angular projects. This comprehensive collection encompasses utility services, directives, and components str

150 lines 20.4 kB
import { NgClass, NgIf } from "@angular/common"; import { Component, ContentChild, Input, ViewChild, ViewContainerRef, forwardRef } from "@angular/core"; import { FormsModule, NG_VALUE_ACCESSOR } from "@angular/forms"; import { IconPosition } from "../../constants/app.constant"; import { VcAllowNumberOnlyDirective } from "../../directives/vc-allow-number-only.directive"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; const modules = [ NgClass, FormsModule, NgIf, VcAllowNumberOnlyDirective, FormsModule ]; export class VcInputComponent { #controlValue; #propagateChange; // Initialize the property #propagateTouched; // Initialize the property //#endregion constructor(renderer) { this.renderer = renderer; //#endregion //#region optional this.type = 'text'; this.position = 'left'; this.placeholder = ''; this.maxLength = undefined; this.required = false; this.isDisabled = false; this.readOnly = false; this.applyAllowNumberOnly = false; this.#controlValue = ''; this.#propagateChange = () => { }; // Initialize the property this.#propagateTouched = () => { }; // Initialize the property } /** * The function returns the value of the private control property. * @returns The value of the private property `#controlValue` is being returned. */ get control() { return this.#controlValue; } /** * The function sets the value of a control and propagates the change to other components. * @param {string} value - The value parameter is a string that represents the new value for the * control. */ set control(value) { this.#controlValue = value; this.#propagateChange !== undefined && this.#propagateChange(this.#controlValue); } /** * The writeValue function assigns a value to the control property if the value is not empty. * @param {string} value - The value parameter is a string that represents the value to be assigned to * the control property. */ writeValue(value) { value && (this.control = value); } /** * The function "registerOnChange" sets a callback function to be called when a change event occurs. * @param fn - A function that will be called when a change event occurs. */ registerOnChange(fn) { this.#propagateChange = fn; } /** * The function "registerOnTouched" assigns a callback function to the "propagateTouched" property. * @param fn - A function that takes no arguments and returns nothing. */ registerOnTouched(fn) { this.#propagateTouched = fn; } /** * The function "touched" calls the "propagateTouched" function with the provided event parameter. * @param {any} - The parameter is typically an object that represents the event that was * triggered. It contains information about the event, such as the target element, event type, and any * additional data associated with the event. In this case, it is of type "any", which means it can be * any type of */ touched($event) { this.#propagateTouched($event); } /** * The ngAfterViewInit function adds dynamic styles to an SVG element and an input element based on the * position value. */ ngAfterViewInit() { if (this.projectedSvgElement) { const element = this.projectedSvgElement?._elementRef.nativeElement; // Add styles dynamically using Renderer2 if (this.position === IconPosition.left) { this.renderer.addClass(element, 'left-[10px]'); this.renderer.addClass(this.inputElement.element.nativeElement, 'pl-[44px]'); } else { this.renderer.addClass(element, 'right-[10px]'); this.renderer.addClass(this.inputElement.element.nativeElement, 'pl-[10px]'); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: VcInputComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: VcInputComponent, isStandalone: true, selector: "vc-input", inputs: { name: "name", type: "type", position: "position", placeholder: "placeholder", maxLength: "maxLength", required: "required", isDisabled: "isDisabled", readOnly: "readOnly", applyAllowNumberOnly: "applyAllowNumberOnly", customClass: "customClass", label: "label", pattern: "pattern", regexType: "regexType" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VcInputComponent), multi: true }], queries: [{ propertyName: "projectedSvgElement", first: true, predicate: ["projectedElement"], descendants: true }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-content select=\"[matIcon]\"></ng-content>\r\n<input #input [(ngModel)]='control' [vcAllowNumberOnly]=\"applyAllowNumberOnly\" [attr.max]=\"maxLength\"\r\n [pattern]=\"pattern\" [required]=\"required\" [attr.name]=\"name\" [regexType]=\"regexType\" [attr.type]=\"type\"\r\n [ngClass]=\"customClass\" [placeholder]=\"placeholder\" (blur)=\"touched($event)\" />", styles: [":host{width:100%}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: VcAllowNumberOnlyDirective, selector: "[vcAllowNumberOnly]", inputs: ["vcAllowNumberOnly", "regexType"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: VcInputComponent, decorators: [{ type: Component, args: [{ selector: 'vc-input', standalone: true, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VcInputComponent), multi: true }], imports: [...modules], template: "<ng-content select=\"[matIcon]\"></ng-content>\r\n<input #input [(ngModel)]='control' [vcAllowNumberOnly]=\"applyAllowNumberOnly\" [attr.max]=\"maxLength\"\r\n [pattern]=\"pattern\" [required]=\"required\" [attr.name]=\"name\" [regexType]=\"regexType\" [attr.type]=\"type\"\r\n [ngClass]=\"customClass\" [placeholder]=\"placeholder\" (blur)=\"touched($event)\" />", styles: [":host{width:100%}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { name: [{ type: Input, args: [{ required: true }] }], type: [{ type: Input }], position: [{ type: Input }], placeholder: [{ type: Input }], maxLength: [{ type: Input }], required: [{ type: Input }], isDisabled: [{ type: Input }], readOnly: [{ type: Input }], applyAllowNumberOnly: [{ type: Input }], customClass: [{ type: Input }], label: [{ type: Input }], pattern: [{ type: Input }], regexType: [{ type: Input }], projectedSvgElement: [{ type: ContentChild, args: ['projectedElement', { static: false }] }], inputElement: [{ type: ViewChild, args: ['input', { read: ViewContainerRef }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmMtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmlpdG9yY2xvdWQtbmctdXRpbGl0eS1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy92Yy1pbnB1dC92Yy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92aWl0b3JjbG91ZC1uZy11dGlsaXR5LWxpYnJhcnkvc3JjL2xpYi9jb21wb25lbnRzL3ZjLWlucHV0L3ZjLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7OztBQUU3RixNQUFNLE9BQU8sR0FBRztJQUNkLE9BQU87SUFDUCxXQUFXO0lBQ1gsSUFBSTtJQUNKLDBCQUEwQjtJQUMxQixXQUFXO0NBQ1osQ0FBQztBQWVGLE1BQU0sT0FBTyxnQkFBZ0I7SUF3QjNCLGFBQWEsQ0FBTTtJQUNuQixnQkFBZ0IsQ0FBd0MsQ0FBQywwQkFBMEI7SUFDbkYsaUJBQWlCLENBQXdDLENBQUMsMEJBQTBCO0lBQ3BGLGFBQWE7SUFFYixZQUFvQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdkJ2QyxhQUFhO1FBRWIsbUJBQW1CO1FBQ1YsU0FBSSxHQUFrQyxNQUFNLENBQUM7UUFD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LEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUMsV0FHTyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dHQVFNLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUloQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVOLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRUgsWUFBWTtzQkFBM0QsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBmb3J3YXJkUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEljb25Qb3NpdGlvbiwgUmVnZXhUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hcHAuY29uc3RhbnRcIjtcclxuaW1wb3J0IHsgVmNBbGxvd051bWJlck9ubHlEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy92Yy1hbGxvdy1udW1iZXItb25seS5kaXJlY3RpdmVcIjtcclxuXHJcbmNvbnN0IG1vZHVsZXMgPSBbXHJcbiAgTmdDbGFzcyxcclxuICBGb3Jtc01vZHVsZSxcclxuICBOZ0lmLFxyXG4gIFZjQWxsb3dOdW1iZXJPbmx5RGlyZWN0aXZlLFxyXG4gIEZvcm1zTW9kdWxlXHJcbl07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ZjLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVmNJbnB1dENvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi92Yy1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdmMtaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbLi4ubW9kdWxlc11cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWY0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKiBUaGVzZSBhcmUgdGhlIGlucHV0IHByb3BlcnRpZXMgYW5kIGNsYXNzIG1lbWJlcnMgb2YgdGhlIGBWY0lucHV0Q29tcG9uZW50YCBjbGFzcy4gKi9cclxuXHJcbiAgLy8jcmVnaW9uIHJlcXVpcmVkXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbmFtZSE6IHN0cmluZztcclxuICAvLyNlbmRyZWdpb24gXHJcblxyXG4gIC8vI3JlZ2lvbiBvcHRpb25hbCBcclxuICBASW5wdXQoKSB0eXBlOiAndGV4dCcgfCAnZW1haWwnIHwgJ3Bhc3N3b3JkJyA9ICd0ZXh0JztcclxuICBASW5wdXQoKSBwb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdsZWZ0JztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG4gIEBJbnB1dCgpIG1heExlbmd0aCA9IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFwcGx5QWxsb3dOdW1iZXJPbmx5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3MhOiBQYXJhbXM7XHJcbiAgQElucHV0KCkgbGFiZWwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGF0dGVybiE6IFJlZ0V4cDtcclxuICBASW5wdXQoKSByZWdleFR5cGUhOiBSZWdleFR5cGU7XHJcbiAgQENvbnRlbnRDaGlsZCgncHJvamVjdGVkRWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHByb2plY3RlZFN2Z0VsZW1lbnQhOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgaW5wdXRFbGVtZW50ITogVmlld0NvbnRhaW5lclJlZjtcclxuICAjY29udHJvbFZhbHVlID0gJyc7XHJcbiAgI3Byb3BhZ2F0ZUNoYW5nZTogKF9wYXJhbTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTsgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHlcclxuICAjcHJvcGFnYXRlVG91Y2hlZDogKF9wYXJhbTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTsgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHlcclxuICAvLyNlbmRyZWdpb24gXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJpdmF0ZSBjb250cm9sIHByb3BlcnR5LlxyXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgcHJpdmF0ZSBwcm9wZXJ0eSBgI2NvbnRyb2xWYWx1ZWAgaXMgYmVpbmcgcmV0dXJuZWQuXHJcbiAgICovXHJcbiAgZ2V0IGNvbnRyb2woKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLiNjb250cm9sVmFsdWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbnRyb2wgYW5kIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZSB0byBvdGhlciBjb21wb25lbnRzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZVxyXG4gICAqIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgc2V0IGNvbnRyb2wodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy4jY29udHJvbFZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UodGhpcy4jY29udHJvbFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB3cml0ZVZhbHVlIGZ1bmN0aW9uIGFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgY29udHJvbCBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgbm90IGVtcHR5LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0b1xyXG4gICAqIHRoZSBjb250cm9sIHByb3BlcnR5LlxyXG4gICAqL1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdmFsdWUgJiYgKHRoaXMuY29udHJvbCA9IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInJlZ2lzdGVyT25DaGFuZ2VcIiBzZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzLlxyXG4gICAqIEBwYXJhbSBmbiAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3Vycy5cclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInJlZ2lzdGVyT25Ub3VjaGVkXCIgYXNzaWducyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBcInByb3BhZ2F0ZVRvdWNoZWRcIiBwcm9wZXJ0eS5cclxuICAgKiBAcGFyYW0gZm4gLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIG5vdGhpbmcuXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMuI3Byb3BhZ2F0ZVRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInRvdWNoZWRcIiBjYWxscyB0aGUgXCJwcm9wYWdhdGVUb3VjaGVkXCIgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgcGFyYW1ldGVyLlxyXG4gICAqIEBwYXJhbSB7YW55fSAgLSBUaGUgIHBhcmFtZXRlciBpcyB0eXBpY2FsbHkgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdGhhdCB3YXNcclxuICAgKiB0cmlnZ2VyZWQuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCwgc3VjaCBhcyB0aGUgdGFyZ2V0IGVsZW1lbnQsIGV2ZW50IHR5cGUsIGFuZCBhbnlcclxuICAgKiBhZGRpdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBpdCBpcyBvZiB0eXBlIFwiYW55XCIsIHdoaWNoIG1lYW5zIGl0IGNhbiBiZVxyXG4gICAqIGFueSB0eXBlIG9mXHJcbiAgICovXHJcbiAgdG91Y2hlZCgkZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy4jcHJvcGFnYXRlVG91Y2hlZCgkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG5nQWZ0ZXJWaWV3SW5pdCBmdW5jdGlvbiBhZGRzIGR5bmFtaWMgc3R5bGVzIHRvIGFuIFNWRyBlbGVtZW50IGFuZCBhbiBpbnB1dCBlbGVtZW50IGJhc2VkIG9uIHRoZVxyXG4gICAqIHBvc2l0aW9uIHZhbHVlLlxyXG4gICAqL1xyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnByb2plY3RlZFN2Z0VsZW1lbnQpIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucHJvamVjdGVkU3ZnRWxlbWVudD8uX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgLy8gQWRkIHN0eWxlcyBkeW5hbWljYWxseSB1c2luZyBSZW5kZXJlcjJcclxuICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09IEljb25Qb3NpdGlvbi5sZWZ0KSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnbGVmdC1bMTBweF0nKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaW5wdXRFbGVtZW50LmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BsLVs0NHB4XScpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ3JpZ2h0LVsxMHB4XScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5pbnB1dEVsZW1lbnQuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGwtWzEwcHhdJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0SWNvbl1cIj48L25nLWNvbnRlbnQ+XHJcbjxpbnB1dCAjaW5wdXQgWyhuZ01vZGVsKV09J2NvbnRyb2wnIFt2Y0FsbG93TnVtYmVyT25seV09XCJhcHBseUFsbG93TnVtYmVyT25seVwiIFthdHRyLm1heF09XCJtYXhMZW5ndGhcIlxyXG4gICAgW3BhdHRlcm5dPVwicGF0dGVyblwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFthdHRyLm5hbWVdPVwibmFtZVwiIFtyZWdleFR5cGVdPVwicmVnZXhUeXBlXCIgW2F0dHIudHlwZV09XCJ0eXBlXCJcclxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgKGJsdXIpPVwidG91Y2hlZCgkZXZlbnQpXCIgLz4iXX0=