@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
370 lines • 34.7 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Inject, Input, OnDestroy, Optional, Self } from '@angular/core';
import { AbstractControl, FormControlName, NgControl, NgModel } from '@angular/forms';
import { IgxInputGroupBase } from '../../input-group/input-group.common';
const nativeValidationAttributes = ['required', 'pattern', 'minlength', 'maxlength', 'min', 'max', 'step'];
export var IgxInputState;
(function (IgxInputState) {
IgxInputState[IgxInputState["INITIAL"] = 0] = "INITIAL";
IgxInputState[IgxInputState["VALID"] = 1] = "VALID";
IgxInputState[IgxInputState["INVALID"] = 2] = "INVALID";
})(IgxInputState || (IgxInputState = {}));
let IgxInputDirective = class IgxInputDirective {
constructor(inputGroup, ngModel, formControl, element, cdr) {
this.inputGroup = inputGroup;
this.ngModel = ngModel;
this.formControl = formControl;
this.element = element;
this.cdr = cdr;
this._valid = IgxInputState.INITIAL;
/**
* Sets/gets whether the `"igx-input-group__input"` class is added to the host element.
* Default value is `false`.
* ```typescript
* this.igxInput.isInput = true;
* ```
* ```typescript
* let isCLassAdded = this.igxInput.isInput;
* ```
* @memberof IgxInputDirective
*/
this.isInput = false;
/**
* Sets/gets whether the `"class.igx-input-group__textarea"` class is added to the host element.
* Default value is `false`.
* ```typescript
* this.igxInput.isTextArea = true;
* ```
* ```typescript
* let isCLassAdded = this.igxInput.isTextArea;
* ```
* @memberof IgxInputDirective
*/
this.isTextArea = false;
}
get ngControl() {
return this.ngModel ? this.ngModel : this.formControl;
}
/**
* Sets the `value` property.
* ```html
* <input-group>
* <input igxInput #igxInput [value]="'IgxInput Value'">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set value(value) {
this.nativeElement.value = value;
this.checkValidity();
}
/**
* Gets the `value` propery.
* ```typescript
* @ViewChild('igxInput', {read: IgxInputDirective})
* public igxInput: IgxInputDirective;
* let inputValue = this.igxInput.value;
* ```
* @memberof IgxInputDirective
*/
get value() {
return this.nativeElement.value;
}
/**
* Sets the `disabled` property.
* ```html
* <input-group>
* <input igxInput #igxInput [disabled]="true">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set disabled(value) {
this.nativeElement.disabled = value;
this.inputGroup.disabled = value;
}
/**
* Gets the `disabled` property
* ```typescript
* @ViewChild('igxInput', {read: IgxInputDirective})
* public igxInput: IgxInputDirective;
* let isDisabled = this.igxInput.disabled;
* ```
* @memberof IgxInputDirective
*/
get disabled() {
return this.nativeElement.hasAttribute('disabled');
}
/**
* Sets the `required` property.
* ```html
* <input-group>
* <input igxInput #igxInput [required]="true">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set required(value) {
if (typeof value === 'boolean') {
this.nativeElement.required = this.inputGroup.isRequired = value;
if (value && !this.nativeElement.checkValidity()) {
this._valid = IgxInputState.INVALID;
}
else {
this._valid = IgxInputState.INITIAL;
}
}
}
/**
* Gets whether the igxInput is required.
* ```typescript
* let isRequired = this.igxInput.required;
* ```
* @memberof IgxInputDirective
*/
get required() {
return this.nativeElement.hasAttribute('required');
}
/**
*@hidden
*/
onFocus(event) {
this.inputGroup.isFocused = true;
}
/**
*@hidden
*/
onBlur(event) {
this.inputGroup.isFocused = false;
this._valid = IgxInputState.INITIAL;
if (this.ngControl) {
if (!this.ngControl.valid) {
this._valid = IgxInputState.INVALID;
}
}
else if (this._hasValidators() && !this.nativeElement.checkValidity()) {
this._valid = IgxInputState.INVALID;
}
}
/**
*@hidden
*/
onInput() {
this.checkValidity();
}
/**
*@hidden
*/
ngAfterViewInit() {
this.inputGroup.hasPlaceholder = this.nativeElement.hasAttribute('placeholder');
this.inputGroup.disabled = this.inputGroup.disabled || this.nativeElement.hasAttribute('disabled');
this.inputGroup.isRequired = this.nativeElement.hasAttribute('required');
// Make sure we do not invalidate the input on init
if (!this.ngControl) {
this._valid = IgxInputState.INITIAL;
}
// Also check the control's validators for required
if (!this.inputGroup.isRequired && this.ngControl && this.ngControl.control.validator) {
const validation = this.ngControl.control.validator({});
this.inputGroup.isRequired = validation && validation.required;
}
const elTag = this.nativeElement.tagName.toLowerCase();
if (elTag === 'textarea') {
this.isTextArea = true;
}
else {
this.isInput = true;
}
if (this.ngControl) {
this._statusChanges$ = this.ngControl.statusChanges.subscribe(this.onStatusChanged.bind(this));
}
this.cdr.detectChanges();
}
/**
*@hidden
*/
ngOnDestroy() {
if (this._statusChanges$) {
this._statusChanges$.unsubscribe();
}
}
/**
* Sets a focus on the igxInput.
* ```typescript
* this.igxInput.focus();
* ```
* @memberof IgxInputDirective
*/
focus() {
this.nativeElement.focus();
}
/**
* Gets the `nativeElement` of the igxInput.
* ```typescript
* let igxInputNativeElement = this.igxInput.nativeElement;
* ```
* @memberof IgxInputDirective
*/
get nativeElement() {
return this.element.nativeElement;
}
/**
*@hidden
*/
onStatusChanged() {
if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) {
if (this.ngControl.control.touched || this.ngControl.control.dirty) {
// TODO: check the logic when control is touched or dirty
if (this.inputGroup.isFocused) {
// the user is still typing in the control
this._valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
}
else {
// the user had touched the control previously but now the value is changing due to changes in the form
this._valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
}
}
else {
// if control is untouched and pristine its state is initial. This is when user did not interact
// with the input or when form/control is reset
this._valid = IgxInputState.INITIAL;
}
}
}
/**
* Gets whether the igxInput has a placeholder.
* ```typescript
* let hasPlaceholder = this.igxInput.hasPlaceholder;
* ```
* @memberof IgxInputDirective
*/
get hasPlaceholder() {
return this.nativeElement.hasAttribute('placeholder');
}
/**
* Gets the placeholder element of the igxInput.
* ```typescript
* let igxInputPlaceholder = this.igxInput.placeholder;
* ```
* @memberof IgxInputDirective
*/
get placeholder() {
return this.nativeElement.placeholder;
}
_hasValidators() {
for (const nativeValidationAttribute of nativeValidationAttributes) {
if (this.nativeElement.hasAttribute(nativeValidationAttribute)) {
return true;
}
}
return !!this.ngControl && (!!this.ngControl.control.validator || !!this.ngControl.control.asyncValidator);
}
/**
* Gets whether the igxInput is focused.
* ```typescript
* let isFocused = this.igxInput.focused;
* ```
* @memberof IgxInputDirective
*/
get focused() {
return this.inputGroup.isFocused;
}
/**
* Gets the state of the igxInput.
* ```typescript
* let igxInputState = this.igxInput.valid;
* ```
* @memberof IgxInputDirective
*/
get valid() {
return this._valid;
}
/**
* Gets whether the igxInput is valid.
* ```typescript
* let valid = this.igxInput.isValid;
* ```
* @memberof IgxInputDirective
*/
get isValid() {
return this.valid !== IgxInputState.INVALID;
}
/**
* Sets the state of the igxInput.
* ```typescript
* this.igxInput.valid = IgxInputState.INVALID;
* ```
* @memberof IgxInputDirective
*/
set valid(value) {
this._valid = value;
}
checkValidity() {
if (!this.ngControl && this._hasValidators()) {
this._valid = this.nativeElement.checkValidity() ? IgxInputState.VALID : IgxInputState.INVALID;
}
}
};
IgxInputDirective.ctorParameters = () => [
{ type: IgxInputGroupBase },
{ type: NgModel, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgModel,] }] },
{ type: FormControlName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormControlName,] }] },
{ type: ElementRef },
{ type: ChangeDetectorRef }
];
__decorate([
Input('value'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxInputDirective.prototype, "value", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxInputDirective.prototype, "disabled", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxInputDirective.prototype, "required", null);
__decorate([
HostBinding('class.igx-input-group__input'),
__metadata("design:type", Object)
], IgxInputDirective.prototype, "isInput", void 0);
__decorate([
HostBinding('class.igx-input-group__textarea'),
__metadata("design:type", Object)
], IgxInputDirective.prototype, "isTextArea", void 0);
__decorate([
HostListener('focus', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onFocus", null);
__decorate([
HostListener('blur', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onBlur", null);
__decorate([
HostListener('input'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onInput", null);
IgxInputDirective = __decorate([
Directive({
selector: '[igxInput]',
exportAs: 'igxInput'
}),
__param(1, Optional()), __param(1, Self()), __param(1, Inject(NgModel)),
__param(2, Optional()), __param(2, Self()), __param(2, Inject(FormControlName)),
__metadata("design:paramtypes", [IgxInputGroupBase,
NgModel,
FormControlName,
ElementRef,
ChangeDetectorRef])
], IgxInputDirective);
export { IgxInputDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixJQUFJLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRyxNQUFNLENBQU4sSUFBWSxhQUlYO0FBSkQsV0FBWSxhQUFhO0lBQ3JCLHVEQUFPLENBQUE7SUFDUCxtREFBSyxDQUFBO0lBQ0wsdURBQU8sQ0FBQTtBQUNYLENBQUMsRUFKVyxhQUFhLEtBQWIsYUFBYSxRQUl4QjtBQU1ELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBSTFCLFlBQ1csVUFBNkIsRUFDVyxPQUFnQixFQUNSLFdBQTRCLEVBQ3pFLE9BQW1CLEVBQ25CLEdBQXNCO1FBSnpCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ1csWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNSLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUN6RSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUjVCLFdBQU0sR0FBRyxhQUFhLENB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RnpCLGlCQUFpQjtRQUNvQixPQUFPO1FBQ0ssZUFBZTtRQUNoRSxVQUFVO1FBQ2QsaUJBQWlCO0dBVDNCLGlCQUFpQixDQTBUN0I7U0ExVFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIFNlbGZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sTmFtZSwgTmdDb250cm9sLCBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQmFzZSB9IGZyb20gJy4uLy4uL2lucHV0LWdyb3VwL2lucHV0LWdyb3VwLmNvbW1vbic7XG5cbmNvbnN0IG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGVzID0gWydyZXF1aXJlZCcsICdwYXR0ZXJuJywgJ21pbmxlbmd0aCcsICdtYXhsZW5ndGgnLCAnbWluJywgJ21heCcsICdzdGVwJ107XG5cbmV4cG9ydCBlbnVtIElneElucHV0U3RhdGUge1xuICAgIElOSVRJQUwsXG4gICAgVkFMSUQsXG4gICAgSU5WQUxJRFxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hJbnB1dF0nLFxuICAgIGV4cG9ydEFzOiAnaWd4SW5wdXQnXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0RGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIF92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzJDogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQmFzZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5nTW9kZWwpIHByb3RlY3RlZCBuZ01vZGVsOiBOZ01vZGVsLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoRm9ybUNvbnRyb2xOYW1lKSBwcm90ZWN0ZWQgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sTmFtZSxcbiAgICAgICAgcHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIHByaXZhdGUgZ2V0IG5nQ29udHJvbCgpOiBOZ0NvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ01vZGVsID8gdGhpcy5uZ01vZGVsIDogdGhpcy5mb3JtQ29udHJvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHZhbHVlYCBwcm9wZXJ0eS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlucHV0LWdyb3VwPlxuICAgICAqICA8aW5wdXQgaWd4SW5wdXQgI2lneElucHV0IFt2YWx1ZV09XCInSWd4SW5wdXQgVmFsdWUnXCI+XG4gICAgICogPC9pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB2YWx1ZWAgcHJvcGVyeS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnaWd4SW5wdXQnLCB7cmVhZDogSWd4SW5wdXREaXJlY3RpdmV9KVxuICAgICAqICBwdWJsaWMgaWd4SW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuICAgICAqIGxldCBpbnB1dFZhbHVlID0gdGhpcy5pZ3hJbnB1dC52YWx1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGRpc2FibGVkYCBwcm9wZXJ0eVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCdpZ3hJbnB1dCcsIHtyZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZX0pXG4gICAgICogIHB1YmxpYyBpZ3hJbnB1dDogSWd4SW5wdXREaXJlY3RpdmU7XG4gICAgICogbGV0IGlzRGlzYWJsZWQgPSB0aGlzLmlneElucHV0LmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGByZXF1aXJlZGAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbcmVxdWlyZWRdPVwidHJ1ZVwiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkID0gdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLm5hdGl2ZUVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBpcyByZXF1aXJlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmVxdWlyZWQgPSB0aGlzLmlneElucHV0LnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBgXCJpZ3gtaW5wdXQtZ3JvdXBfX2lucHV0XCJgIGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBob3N0IGVsZW1lbnQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LmlzSW5wdXQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNDTGFzc0FkZGVkID0gdGhpcy5pZ3hJbnB1dC5pc0lucHV0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwX19pbnB1dCcpXG4gICAgcHVibGljIGlzSW5wdXQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYFwiY2xhc3MuaWd4LWlucHV0LWdyb3VwX190ZXh0YXJlYVwiYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgaG9zdCBlbGVtZW50LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hJbnB1dC5pc1RleHRBcmVhID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ0xhc3NBZGRlZCA9IHRoaXMuaWd4SW5wdXQuaXNUZXh0QXJlYTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cF9fdGV4dGFyZWEnKVxuICAgIHB1YmxpYyBpc1RleHRBcmVhID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc1ZhbGlkYXRvcnMoKSAmJiAhdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnKVxuICAgIHB1YmxpYyBvbklucHV0KCkge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaGFzUGxhY2Vob2xkZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgPSB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgfHwgdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkbyBub3QgaW52YWxpZGF0ZSB0aGUgaW5wdXQgb24gaW5pdFxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGNoZWNrIHRoZSBjb250cm9sJ3MgdmFsaWRhdG9ycyBmb3IgcmVxdWlyZWRcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCAmJiB0aGlzLm5nQ29udHJvbCAmJiB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCA9IHZhbGlkYXRpb24gJiYgdmFsaWRhdGlvbi5yZXF1aXJlZDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgZWxUYWcgPSB0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoZWxUYWcgPT09ICd0ZXh0YXJlYScpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXh0QXJlYSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5wdXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJCA9IHRoaXMubmdDb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1c0NoYW5nZXMkKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBmb2N1cyBvbiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQuZm9jdXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbmF0aXZlRWxlbWVudGAgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXROYXRpdmVFbGVtZW50ID0gdGhpcy5pZ3hJbnB1dC5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25TdGF0dXNDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgLy8gIFRPRE86IGNoZWNrIHRoZSBsb2dpYyB3aGVuIGNvbnRyb2wgaXMgdG91Y2hlZCBvciBkaXJ0eVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIGlzIHN0aWxsIHR5cGluZyBpbiB0aGUgY29udHJvbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5WQUxJRCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBoYWQgdG91Y2hlZCB0aGUgY29udHJvbCBwcmV2aW91c2x5IGJ1dCBub3cgdGhlIHZhbHVlIGlzIGNoYW5naW5nIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gdGhpcy5uZ0NvbnRyb2wudmFsaWQgPyBJZ3hJbnB1dFN0YXRlLklOSVRJQUwgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgaWYgY29udHJvbCBpcyB1bnRvdWNoZWQgYW5kIHByaXN0aW5lIGl0cyBzdGF0ZSBpcyBpbml0aWFsLiBUaGlzIGlzIHdoZW4gdXNlciBkaWQgbm90IGludGVyYWN0XG4gICAgICAgICAgICAgICAgLy8gIHdpdGggdGhlIGlucHV0IG9yIHdoZW4gZm9ybS9jb250cm9sIGlzIHJlc2V0XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBoYXMgYSBwbGFjZWhvbGRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGhhc1BsYWNlaG9sZGVyID0gdGhpcy5pZ3hJbnB1dC5oYXNQbGFjZWhvbGRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1BsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncGxhY2Vob2xkZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudCBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpZ3hJbnB1dFBsYWNlaG9sZGVyID0gdGhpcy5pZ3hJbnB1dC5wbGFjZWhvbGRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhc1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZSBvZiBuYXRpdmVWYWxpZGF0aW9uQXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUobmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMubmdDb250cm9sICYmICghIXRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8ICEhdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgZm9jdXNlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRm9jdXNlZCA9IHRoaXMuaWd4SW5wdXQuZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvY3VzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpZ3hJbnB1dFN0YXRlID0gdGhpcy5pZ3hJbnB1dC52YWxpZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbGlkKCk6IElneElucHV0U3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBpcyB2YWxpZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHZhbGlkID0gdGhpcy5pZ3hJbnB1dC5pc1ZhbGlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWQgIT09IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWx1ZTogSWd4SW5wdXRTdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbCAmJiB0aGlzLl9oYXNWYWxpZGF0b3JzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=