UNPKG

ngx-materialize

Version:

An Angular wrap around Materialize library

266 lines (265 loc) 25.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Directive, ElementRef, Input, Optional, Renderer } from '@angular/core'; import { NgControl } from '@angular/forms'; import { interval } from 'rxjs'; import { first, skipWhile } from 'rxjs/operators'; import { HandlePropChanges } from '../shared/index'; export class MzInputDirective extends HandlePropChanges { /** * @param {?} ngControl * @param {?} elementRef * @param {?} renderer */ constructor(ngControl, elementRef, renderer) { super(); this.ngControl = ngControl; this.elementRef = elementRef; this.renderer = renderer; } /** * @return {?} */ ngOnInit() { this.initHandlers(); this.initElements(); this.initInputSubscription(); this.handleProperties(); } /** * @return {?} */ ngOnDestroy() { if (this.inputValueSubscription) { this.inputValueSubscription.unsubscribe(); } } /** * @return {?} */ initHandlers() { this.handlers = { autocomplete: () => this.handleAutocomplete(), dataError: () => this.handleDataError(), dataSuccess: () => this.handleDataSuccess(), label: () => this.handleLabel(), length: () => this.handleLength(), placeholder: () => this.handlePlaceholder(), validate: () => this.handleValidate(), }; } /** * @return {?} */ initElements() { this.inputElement = $(this.elementRef.nativeElement); this.inputContainerElement = $(this.elementRef.nativeElement).parent('.input-field'); this.labelElement = this.createLabelElement(); } /** * @return {?} */ initInputSubscription() { if (this.ngControl) { this.inputValueSubscription = this.ngControl.valueChanges.subscribe(() => this.setLabelActive()); } } /** * @return {?} */ createLabelElement() { const /** @type {?} */ labelElement = document.createElement('label'); labelElement.setAttribute('for', this.id); this.renderer.invokeElementMethod(this.inputElement, 'after', [labelElement]); return $(labelElement); } /** * @return {?} */ handleProperties() { if (this.inputContainerElement.length === 0) { console.error('Input with mz-input directive must be placed inside an [mz-input-container] tag', this.inputElement); return; } super.executePropHandlers(); } /** * @return {?} */ handleAutocomplete() { const /** @type {?} */ isAutocomplete = this.autocomplete != null && this.autocomplete.data != null && Object.keys(this.autocomplete.data).length > 0; this.renderer.setElementClass(this.inputElement[0], 'autocomplete', isAutocomplete); if (this.autocomplete != null) { // wait until autocomplete is defined before to invoke // see issue: https://github.com/Dogfalo/materialize/issues/4401 interval(100) .pipe(skipWhile(() => !this.inputElement['autocomplete']), first()) .subscribe(() => this.renderer.invokeElementMethod(this.inputElement, 'autocomplete', [this.autocomplete])); } } /** * @return {?} */ handleDataError() { this.renderer.setElementAttribute(this.labelElement[0], 'data-error', this.dataError); } /** * @return {?} */ handleDataSuccess() { this.renderer.setElementAttribute(this.labelElement[0], 'data-success', this.dataSuccess); } /** * @return {?} */ handleLabel() { this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]); } /** * @return {?} */ handleLength() { const /** @type {?} */ length = this.length ? this.length.toString() : null; this.renderer.setElementAttribute(this.inputElement[0], 'data-length', length); if (length) { this.setCharacterCount(); } else { this.removeCharacterCount(); } } /** * @return {?} */ handlePlaceholder() { const /** @type {?} */ placeholder = !!this.placeholder ? this.placeholder : null; this.renderer.setElementAttribute(this.inputElement[0], 'placeholder', placeholder); // fix issue in IE where having a placeholder on input make control dirty // note that it still trigger validation on focus but this is better than nothing // issue : https://github.com/angular/angular/issues/15299 // workaround : https://stackoverflow.com/a/44967245/5583283 if (this.ngControl) { setTimeout(() => this.ngControl.control.markAsPristine()); } this.setLabelActive(); } /** * @return {?} */ handleValidate() { this.renderer.setElementClass(this.inputElement[0], 'validate', this.validate); if (this.validate) { // force validation this.renderer.invokeElementMethod(this.inputElement, 'trigger', ['blur']); } else { this.removeValidationClasses(); } } /** * @return {?} */ setCharacterCount() { this.renderer.invokeElementMethod(this.inputElement, 'characterCounter'); // force validation // need setTimeout otherwise it wont trigger validation right away setTimeout(() => { this.renderer.invokeElementMethod(this.inputElement, 'trigger', ['input']); this.renderer.invokeElementMethod(this.inputElement, 'trigger', ['blur']); }); } /** * @return {?} */ setLabelActive() { // need setTimeout otherwise it wont make label float in some circonstances // for example: forcing validation for example, reseting form programmaticaly, ... setTimeout(() => { const /** @type {?} */ inputValue = (/** @type {?} */ (this.inputElement[0])).value; const /** @type {?} */ isActive = !!this.placeholder || !!inputValue; this.renderer.setElementClass(this.labelElement[0], 'active', isActive); }); } /** * @return {?} */ removeCharacterCount() { this.renderer.invokeElementMethod(this.inputElement.siblings('.character-counter'), 'remove'); this.removeValidationClasses(); } /** * @return {?} */ removeValidationClasses() { // reset valid/invalid state this.renderer.setElementClass(this.inputElement[0], 'invalid', false); this.renderer.setElementClass(this.inputElement[0], 'valid', false); } } MzInputDirective.decorators = [ { type: Directive, args: [{ selector: 'input[mzInput], input[mz-input]', },] }, ]; /** @nocollapse */ MzInputDirective.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional },] }, { type: ElementRef, }, { type: Renderer, }, ]; MzInputDirective.propDecorators = { "id": [{ type: Input },], "placeholder": [{ type: Input },], "autocomplete": [{ type: Input },], "dataError": [{ type: Input },], "dataSuccess": [{ type: Input },], "label": [{ type: Input },], "length": [{ type: Input },], "validate": [{ type: Input },], }; function MzInputDirective_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MzInputDirective.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MzInputDirective.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MzInputDirective.propDecorators; /** @type {?} */ MzInputDirective.prototype.id; /** @type {?} */ MzInputDirective.prototype.placeholder; /** @type {?} */ MzInputDirective.prototype.autocomplete; /** @type {?} */ MzInputDirective.prototype.dataError; /** @type {?} */ MzInputDirective.prototype.dataSuccess; /** @type {?} */ MzInputDirective.prototype.label; /** @type {?} */ MzInputDirective.prototype.length; /** @type {?} */ MzInputDirective.prototype.validate; /** @type {?} */ MzInputDirective.prototype.inputElement; /** @type {?} */ MzInputDirective.prototype.inputContainerElement; /** @type {?} */ MzInputDirective.prototype.inputValueSubscription; /** @type {?} */ MzInputDirective.prototype.labelElement; /** @type {?} */ MzInputDirective.prototype.ngControl; /** @type {?} */ MzInputDirective.prototype.elementRef; /** @type {?} */ MzInputDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LW1hdGVyaWFsaXplLyIsInNvdXJjZXMiOlsic3JjL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3BELE1BQU0sdUJBQXdCLFNBQVEsaUJBQWlCOzs7Ozs7SUFrQnJELFlBQ3NCLFdBQ1osWUFDQTtRQUVSLEtBQUssRUFBRSxDQUFDO1FBSlksY0FBUyxHQUFULFNBQVM7UUFDckIsZUFBVSxHQUFWLFVBQVU7UUFDVixhQUFRLEdBQVIsUUFBUTtLQUdqQjs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3pCOzs7O0lBRUQsV0FBVztRQUNULEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNDO0tBQ0Y7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMs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LEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFJlbmRlcmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgaW50ZXJ2YWwsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaXJzdCwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgSGFuZGxlUHJvcENoYW5nZXMgfSBmcm9tICcuLi9zaGFyZWQvaW5kZXgnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdpbnB1dFtteklucHV0XSwgaW5wdXRbbXotaW5wdXRdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE16SW5wdXREaXJlY3RpdmUgZXh0ZW5kcyBIYW5kbGVQcm9wQ2hhbmdlcyBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvLyBuYXRpdmUgcHJvcGVydGllc1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgLy8gZGlyZWN0aXZlIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IHsgZGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9O1xyXG4gIEBJbnB1dCgpIGRhdGFFcnJvcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRhdGFTdWNjZXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBsZW5ndGg6IG51bWJlcjtcclxuICBASW5wdXQoKSB2YWxpZGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgaW5wdXRFbGVtZW50OiBKUXVlcnk7XHJcbiAgaW5wdXRDb250YWluZXJFbGVtZW50OiBKUXVlcnk7XHJcbiAgaW5wdXRWYWx1ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGxhYmVsRWxlbWVudDogSlF1ZXJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdEhhbmRsZXJzKCk7XHJcbiAgICB0aGlzLmluaXRFbGVtZW50cygpO1xyXG4gICAgdGhpcy5pbml0SW5wdXRTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuaGFuZGxlUHJvcGVydGllcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dFZhbHVlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEhhbmRsZXJzKCkge1xyXG4gICAgdGhpcy5oYW5kbGVycyA9IHtcclxuICAgICAgYXV0b2NvbXBsZXRlOiAoKSA9PiB0aGlzLmhhbmRsZUF1dG9jb21wbGV0ZSgpLFxyXG4gICAgICBkYXRhRXJyb3I6ICgpID0+IHRoaXMuaGFuZGxlRGF0YUVycm9yKCksXHJcbiAgICAgIGRhdGFTdWNjZXNzOiAoKSA9PiB0aGlzLmhhbmRsZURhdGFTdWNjZXNzKCksXHJcbiAgICAgIGxhYmVsOiAoKSA9PiB0aGlzLmhhbmRsZUxhYmVsKCksXHJcbiAgICAgIGxlbmd0aDogKCkgPT4gdGhpcy5oYW5kbGVMZW5ndGgoKSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICgpID0+IHRoaXMuaGFuZGxlUGxhY2Vob2xkZXIoKSxcclxuICAgICAgdmFsaWRhdGU6ICgpID0+IHRoaXMuaGFuZGxlVmFsaWRhdGUoKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBpbml0RWxlbWVudHMoKSB7XHJcbiAgICB0aGlzLmlucHV0RWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5pbnB1dENvbnRhaW5lckVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnQoJy5pbnB1dC1maWVsZCcpO1xyXG4gICAgdGhpcy5sYWJlbEVsZW1lbnQgPSB0aGlzLmNyZWF0ZUxhYmVsRWxlbWVudCgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdElucHV0U3Vic2NyaXB0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVN1YnNjcmlwdGlvbiA9IHRoaXMubmdDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRMYWJlbEFjdGl2ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZUxhYmVsRWxlbWVudCgpIHtcclxuICAgIGNvbnN0IGxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICBsYWJlbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLmlkKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5pbnB1dEVsZW1lbnQsICdhZnRlcicsIFtsYWJlbEVsZW1lbnRdKTtcclxuXHJcbiAgICByZXR1cm4gJChsYWJlbEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUHJvcGVydGllcygpIHtcclxuICAgIGlmICh0aGlzLmlucHV0Q29udGFpbmVyRWxlbWVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignSW5wdXQgd2l0aCBtei1pbnB1dCBkaXJlY3RpdmUgbXVzdCBiZSBwbGFjZWQgaW5zaWRlIGFuIFttei1pbnB1dC1jb250YWluZXJdIHRhZycsIHRoaXMuaW5wdXRFbGVtZW50KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN1cGVyLmV4ZWN1dGVQcm9wSGFuZGxlcnMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUF1dG9jb21wbGV0ZSgpIHtcclxuICAgIGNvbnN0IGlzQXV0b2NvbXBsZXRlID0gdGhpcy5hdXRvY29tcGxldGUgIT0gbnVsbFxyXG4gICAgICAmJiB0aGlzLmF1dG9jb21wbGV0ZS5kYXRhICE9IG51bGxcclxuICAgICAgJiYgT2JqZWN0LmtleXModGhpcy5hdXRvY29tcGxldGUuZGF0YSkubGVuZ3RoID4gMDtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmlucHV0RWxlbWVudFswXSwgJ2F1dG9jb21wbGV0ZScsIGlzQXV0b2NvbXBsZXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUgIT0gbnVsbCkge1xyXG4gICAgICAvLyB3YWl0IHVudGlsIGF1dG9jb21wbGV0ZSBpcyBkZWZpbmVkIGJlZm9yZSB0byBpbnZva2VcclxuICAgICAgLy8gc2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vRG9nZmFsby9tYXRlcmlhbGl6ZS9pc3N1ZXMvNDQwMVxyXG4gICAgICBpbnRlcnZhbCgxMDApXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBza2lwV2hpbGUoKCkgPT4gIXRoaXMuaW5wdXRFbGVtZW50WydhdXRvY29tcGxldGUnXSksXHJcbiAgICAgICAgICBmaXJzdCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuaW5wdXRFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgW3RoaXMuYXV0b2NvbXBsZXRlXSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGF0YUVycm9yKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKHRoaXMubGFiZWxFbGVtZW50WzBdLCAnZGF0YS1lcnJvcicsIHRoaXMuZGF0YUVycm9yKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGFTdWNjZXNzKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKHRoaXMubGFiZWxFbGVtZW50WzBdLCAnZGF0YS1zdWNjZXNzJywgdGhpcy5kYXRhU3VjY2Vzcyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVMYWJlbCgpIHtcclxuICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmxhYmVsRWxlbWVudCwgJ3RleHQnLCBbdGhpcy5sYWJlbF0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlTGVuZ3RoKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aC50b1N0cmluZygpIDogbnVsbDtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnRbMF0sICdkYXRhLWxlbmd0aCcsIGxlbmd0aCk7XHJcblxyXG4gICAgaWYgKGxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNldENoYXJhY3RlckNvdW50KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUNoYXJhY3RlckNvdW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQbGFjZWhvbGRlcigpIHtcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gISF0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlciA6IG51bGw7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnRbMF0sICdwbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyKTtcclxuXHJcbiAgICAvLyBmaXggaXNzdWUgaW4gSUUgd2hlcmUgaGF2aW5nIGEgcGxhY2Vob2xkZXIgb24gaW5wdXQgbWFrZSBjb250cm9sIGRpcnR5XHJcbiAgICAvLyBub3RlIHRoYXQgaXQgc3RpbGwgdHJpZ2dlciB2YWxpZGF0aW9uIG9uIGZvY3VzIGJ1dCB0aGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmdcclxuICAgIC8vIGlzc3VlIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTUyOTlcclxuICAgIC8vIHdvcmthcm91bmQgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDQ5NjcyNDUvNTU4MzI4M1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNQcmlzdGluZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldExhYmVsQWN0aXZlKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVWYWxpZGF0ZSgpIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuaW5wdXRFbGVtZW50WzBdLCAndmFsaWRhdGUnLCB0aGlzLnZhbGlkYXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy52YWxpZGF0ZSkge1xyXG4gICAgICAvLyBmb3JjZSB2YWxpZGF0aW9uXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmlucHV0RWxlbWVudCwgJ3RyaWdnZXInLCBbJ2JsdXInXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZVZhbGlkYXRpb25DbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRDaGFyYWN0ZXJDb3VudCgpIHtcclxuICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmlucHV0RWxlbWVudCwgJ2NoYXJhY3RlckNvdW50ZXInKTtcclxuXHJcbiAgICAvLyBmb3JjZSB2YWxpZGF0aW9uXHJcbiAgICAvLyBuZWVkIHNldFRpbWVvdXQgb3RoZXJ3aXNlIGl0IHdvbnQgdHJpZ2dlciB2YWxpZGF0aW9uIHJpZ2h0IGF3YXlcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5pbnB1dEVsZW1lbnQsICd0cmlnZ2VyJywgWydpbnB1dCddKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuaW5wdXRFbGVtZW50LCAndHJpZ2dlcicsIFsnYmx1ciddKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0TGFiZWxBY3RpdmUoKSB7XHJcbiAgICAvLyBuZWVkIHNldFRpbWVvdXQgb3RoZXJ3aXNlIGl0IHdvbnQgbWFrZSBsYWJlbCBmbG9hdCBpbiBzb21lIGNpcmNvbnN0YW5jZXNcclxuICAgIC8vIGZvciBleGFtcGxlOiBmb3JjaW5nIHZhbGlkYXRpb24gZm9yIGV4YW1wbGUsIHJlc2V0aW5nIGZvcm0gcHJvZ3JhbW1hdGljYWx5LCAuLi5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbnB1dFZhbHVlID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuaW5wdXRFbGVtZW50WzBdKS52YWx1ZTtcclxuICAgICAgY29uc3QgaXNBY3RpdmUgPSAhIXRoaXMucGxhY2Vob2xkZXIgfHwgISFpbnB1dFZhbHVlO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmxhYmVsRWxlbWVudFswXSwgJ2FjdGl2ZScsIGlzQWN0aXZlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2hhcmFjdGVyQ291bnQoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5pbnB1dEVsZW1lbnQuc2libGluZ3MoJy5jaGFyYWN0ZXItY291bnRlcicpLCAncmVtb3ZlJyk7XHJcblxyXG4gICAgdGhpcy5yZW1vdmVWYWxpZGF0aW9uQ2xhc3NlcygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVmFsaWRhdGlvbkNsYXNzZXMoKSB7XHJcbiAgICAvLyByZXNldCB2YWxpZC9pbnZhbGlkIHN0YXRlXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmlucHV0RWxlbWVudFswXSwgJ2ludmFsaWQnLCBmYWxzZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmlucHV0RWxlbWVudFswXSwgJ3ZhbGlkJywgZmFsc2UpO1xyXG4gIH1cclxufVxyXG4iXX0=