@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
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmMtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmlpdG9yY2xvdWQtbmctdXRpbGl0eS1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy92Yy1pbnB1dC92Yy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92aWl0b3JjbG91ZC1uZy11dGlsaXR5LWxpYnJhcnkvc3JjL2xpYi9jb21wb25lbnRzL3ZjLWlucHV0L3ZjLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7OztBQUU3RixNQUFNLE9BQU8sR0FBRztJQUNkLE9BQU87SUFDUCxXQUFXO0lBQ1gsSUFBSTtJQUNKLDBCQUEwQjtJQUMxQixXQUFXO0NBQ1osQ0FBQztBQWVGLE1BQU0sT0FBTyxnQkFBZ0I7SUF3QjNCLGFBQWEsQ0FBTTtJQUNuQixnQkFBZ0IsQ0FBd0MsQ0FBQywwQkFBMEI7SUFDbkYsaUJBQWlCLENBQXdDLENBQUMsMEJBQTBCO0lBQ3BGLGFBQWE7SUFFYixZQUFvQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdkJ2QyxhQUFhO1FBRWIsbUJBQW1CO1FBQ1YsU0FBSSxHQUFrQyxNQUFNLENBQUM7UUFDN0MsYUFBUSxHQUFxQixNQUFNLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFRdEMsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIscUJBQWdCLEdBQThCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUNuRixzQkFBaUIsR0FBOEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsMEJBQTBCO0lBR3pDLENBQUM7SUFFNUM7OztPQUdHO0lBQ0gsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsSUFBSSxPQUFPLENBQUMsS0FBYTtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsS0FBYTtRQUN0QixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFjO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLE1BQVc7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDcEUseUNBQXlDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUM5RTtpQkFDSTtnQkFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUM5RTtTQUNGO0lBQ0gsQ0FBQzs4R0FyR1UsZ0JBQWdCO2tHQUFoQixnQkFBZ0IscVhBVmhCLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0MsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLGlPQTZCMEIsZ0JBQWdCLDZCQ25EOUMsbVhBR21GLDZFREtqRixPQUFPLG1GQUNQLFdBQVcscStCQUVYLDBCQUEwQjs7MkZBaUJmLGdCQUFnQjtrQkFiNUIsU0FBUzsrQkFDRSxVQUFVLGNBQ1IsSUFBSSxhQUNMLENBQUM7NEJBQ1YsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUM7NEJBQy9DLEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUMsV0FHTyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dHQVFNLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUloQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVOLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRUgsWUFBWTtzQkFBM0QsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBmb3J3YXJkUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEljb25Qb3NpdGlvbiwgUmVnZXhUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hcHAuY29uc3RhbnRcIjtcclxuaW1wb3J0IHsgVmNBbGxvd051bWJlck9ubHlEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy92Yy1hbGxvdy1udW1iZXItb25seS5kaXJlY3RpdmVcIjtcclxuXHJcbmNvbnN0IG1vZHVsZXMgPSBbXHJcbiAgTmdDbGFzcyxcclxuICBGb3Jtc01vZHVsZSxcclxuICBOZ0lmLFxyXG4gIFZjQWxsb3dOdW1iZXJPbmx5RGlyZWN0aXZlLFxyXG4gIEZvcm1zTW9kdWxlXHJcbl07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ZjLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVmNJbnB1dENvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi92Yy1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdmMtaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbLi4ubW9kdWxlc11cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWY0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKiBUaGVzZSBhcmUgdGhlIGlucHV0IHByb3BlcnRpZXMgYW5kIGNsYXNzIG1lbWJlcnMgb2YgdGhlIGBWY0lucHV0Q29tcG9uZW50YCBjbGFzcy4gKi9cclxuXHJcbiAgLy8jcmVnaW9uIHJlcXVpcmVkXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbmFtZSE6IHN0cmluZztcclxuICAvLyNlbmRyZWdpb24gXHJcblxyXG4gIC8vI3JlZ2lvbiBvcHRpb25hbCBcclxuICBASW5wdXQoKSB0eXBlOiAndGV4dCcgfCAnZW1haWwnIHwgJ3Bhc3N3b3JkJyA9ICd0ZXh0JztcclxuICBASW5wdXQoKSBwb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdsZWZ0JztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG4gIEBJbnB1dCgpIG1heExlbmd0aCA9IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFwcGx5QWxsb3dOdW1iZXJPbmx5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3MhOiBQYXJhbXM7XHJcbiAgQElucHV0KCkgbGFiZWwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGF0dGVybiE6IFJlZ0V4cDtcclxuICBASW5wdXQoKSByZWdleFR5cGUhOiBSZWdleFR5cGU7XHJcbiAgQENvbnRlbnRDaGlsZCgncHJvamVjdGVkRWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHByb2plY3RlZFN2Z0VsZW1lbnQhOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgaW5wdXRFbGVtZW50ITogVmlld0NvbnRhaW5lclJlZjtcclxuICAjY29udHJvbFZhbHVlID0gJyc7XHJcbiAgI3Byb3BhZ2F0ZUNoYW5nZTogKF9wYXJhbTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTsgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHlcclxuICAjcHJvcGFnYXRlVG91Y2hlZDogKF9wYXJhbTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTsgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHlcclxuICAvLyNlbmRyZWdpb24gXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJpdmF0ZSBjb250cm9sIHByb3BlcnR5LlxyXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgcHJpdmF0ZSBwcm9wZXJ0eSBgI2NvbnRyb2xWYWx1ZWAgaXMgYmVpbmcgcmV0dXJuZWQuXHJcbiAgICovXHJcbiAgZ2V0IGNvbnRyb2woKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLiNjb250cm9sVmFsdWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSB2YWx1ZSBvZiBhIGNvbnRyb2wgYW5kIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZSB0byBvdGhlciBjb21wb25lbnRzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZVxyXG4gICAqIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgc2V0IGNvbnRyb2wodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy4jY29udHJvbFZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UodGhpcy4jY29udHJvbFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB3cml0ZVZhbHVlIGZ1bmN0aW9uIGFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgY29udHJvbCBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgbm90IGVtcHR5LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0b1xyXG4gICAqIHRoZSBjb250cm9sIHByb3BlcnR5LlxyXG4gICAqL1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdmFsdWUgJiYgKHRoaXMuY29udHJvbCA9IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInJlZ2lzdGVyT25DaGFuZ2VcIiBzZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzLlxyXG4gICAqIEBwYXJhbSBmbiAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3Vycy5cclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLiNwcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInJlZ2lzdGVyT25Ub3VjaGVkXCIgYXNzaWducyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBcInByb3BhZ2F0ZVRvdWNoZWRcIiBwcm9wZXJ0eS5cclxuICAgKiBAcGFyYW0gZm4gLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIG5vdGhpbmcuXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMuI3Byb3BhZ2F0ZVRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdW5jdGlvbiBcInRvdWNoZWRcIiBjYWxscyB0aGUgXCJwcm9wYWdhdGVUb3VjaGVkXCIgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgZXZlbnQgcGFyYW1ldGVyLlxyXG4gICAqIEBwYXJhbSB7YW55fSAgLSBUaGUgIHBhcmFtZXRlciBpcyB0eXBpY2FsbHkgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdGhhdCB3YXNcclxuICAgKiB0cmlnZ2VyZWQuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCwgc3VjaCBhcyB0aGUgdGFyZ2V0IGVsZW1lbnQsIGV2ZW50IHR5cGUsIGFuZCBhbnlcclxuICAgKiBhZGRpdGlvbmFsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBpdCBpcyBvZiB0eXBlIFwiYW55XCIsIHdoaWNoIG1lYW5zIGl0IGNhbiBiZVxyXG4gICAqIGFueSB0eXBlIG9mXHJcbiAgICovXHJcbiAgdG91Y2hlZCgkZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy4jcHJvcGFnYXRlVG91Y2hlZCgkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG5nQWZ0ZXJWaWV3SW5pdCBmdW5jdGlvbiBhZGRzIGR5bmFtaWMgc3R5bGVzIHRvIGFuIFNWRyBlbGVtZW50IGFuZCBhbiBpbnB1dCBlbGVtZW50IGJhc2VkIG9uIHRoZVxyXG4gICAqIHBvc2l0aW9uIHZhbHVlLlxyXG4gICAqL1xyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnByb2plY3RlZFN2Z0VsZW1lbnQpIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucHJvamVjdGVkU3ZnRWxlbWVudD8uX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgLy8gQWRkIHN0eWxlcyBkeW5hbWljYWxseSB1c2luZyBSZW5kZXJlcjJcclxuICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09IEljb25Qb3NpdGlvbi5sZWZ0KSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnbGVmdC1bMTBweF0nKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaW5wdXRFbGVtZW50LmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BsLVs0NHB4XScpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ3JpZ2h0LVsxMHB4XScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5pbnB1dEVsZW1lbnQuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGwtWzEwcHhdJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0SWNvbl1cIj48L25nLWNvbnRlbnQ+XHJcbjxpbnB1dCAjaW5wdXQgWyhuZ01vZGVsKV09J2NvbnRyb2wnIFt2Y0FsbG93TnVtYmVyT25seV09XCJhcHBseUFsbG93TnVtYmVyT25seVwiIFthdHRyLm1heF09XCJtYXhMZW5ndGhcIlxyXG4gICAgW3BhdHRlcm5dPVwicGF0dGVyblwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFthdHRyLm5hbWVdPVwibmFtZVwiIFtyZWdleFR5cGVdPVwicmVnZXhUeXBlXCIgW2F0dHIudHlwZV09XCJ0eXBlXCJcclxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgKGJsdXIpPVwidG91Y2hlZCgkZXZlbnQpXCIgLz4iXX0=