UNPKG

ngx-pluto

Version:
302 lines 24.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, forwardRef, HostListener } from "@angular/core"; import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from "@angular/forms"; /** * 多行文本输入框 * * <example-url>https://stackblitz.com/edit/np-textarea-example?embed=1&file=src/app/app.component.html</example-url> */ export class NpTextarea { constructor() { this.navigationKeys = [ 'Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'Home', 'End', 'ArrowLeft', 'ArrowRight', 'Clear', 'Copy', 'Paste' ]; this.currentLen = 0; this.chineseReg = /[^\x00-\xff]/g; /** * 占位符 */ this.placeholder = ''; /** * 最大长度 * * Default -1 indicate that the length of input is not limited * The max of maxLen is 999 */ this.maxLen = -1; /** * 只允许填写数字 */ this.numberOnly = false; this.emitChange = (/** * @param {?} _ * @return {?} */ (_) => { }); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterViewInit() { } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes) { } } /** * @param {?} event * @return {?} */ onChange(event) { /** @type {?} */ let newValue = event.target.value; this.emitChange(newValue); } /** * @param {?} obj * @return {?} */ writeValue(obj) { if (obj || obj === '') { this.val = obj; if (this.maxLen > -1) { this.calculateCurrentLen(); } } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.emitChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { } /** * @param {?} control * @return {?} */ validate(control) { // TODO: customize validation return null; } /** * @param {?} e * @return {?} */ onKeyup(e) { if (this.maxLen === -1) { return; } if (this.maxLen > -1) { this.calculateCurrentLen(); // Hack: when typing chinese character, input control will not prevent the character typing /** @type {?} */ let chineseCharLen = this.val ? (this.val.match(this.chineseReg) || []) : []; if (chineseCharLen.length > 0) { this.val = this.val.substring(0, this.maxLen); } } if (this.numberOnly) { this.val = this.val ? this.val.replace(this.chineseReg, '') : ''; } } /** * @private * @return {?} */ isTriggerKeyEvents() { return this.maxLen !== -1 || this.numberOnly; } /** * @param {?} e * @return {?} */ onKeyDown(e) { if (!this.isTriggerKeyEvents()) { return; } if (this.navigationKeys.indexOf(e.key) > -1 || // Allow: navigation keys: backspace, delete, arrows etc. (e.key === 'a' && e.ctrlKey === true) || // Allow: Ctrl+A (e.key === 'c' && e.ctrlKey === true) || // Allow: Ctrl+C (e.key === 'v' && e.ctrlKey === true) || // Allow: Ctrl+V (e.key === 'x' && e.ctrlKey === true) || // Allow: Ctrl+X (e.key === 'a' && e.metaKey === true) || // Allow: Cmd+A (Mac) (e.key === 'c' && e.metaKey === true) || // Allow: Cmd+C (Mac) (e.key === 'v' && e.metaKey === true) || // Allow: Cmd+V (Mac) (e.key === 'x' && e.metaKey === true) // Allow: Cmd+X (Mac) ) { return; } if (this.maxLen > -1) { /** @type {?} */ let hightlightText = window.getSelection() + ''; if (this.val && this.val.length >= this.maxLen && hightlightText === '') { e.preventDefault(); } } if (this.numberOnly) { if (isNaN(Number(e.key))) { e.preventDefault(); } } } /** * @param {?} event * @return {?} */ onPaste(event) { if (!this.isTriggerKeyEvents()) { return; } event.preventDefault(); /** @type {?} */ let currentVal = this.val; if (this.maxLen > -1 || this.numberOnly) { /** @type {?} */ let clipboardData = event.clipboardData.getData('text/plain'); if (this.numberOnly) { /** @type {?} */ let pastedInput = clipboardData.replace(/\D/g, ''); this.val = currentVal + pastedInput; } if (this.maxLen > -1) { /** @type {?} */ let pastedInput = clipboardData.substring(0, this.maxLen); this.val = currentVal + pastedInput; } } } /** * @private * @return {?} */ calculateCurrentLen() { this.currentLen = this.val ? this.val.length : 0; this.currentLen = this.currentLen > this.maxLen ? this.maxLen : this.currentLen; } } NpTextarea.decorators = [ { type: Component, args: [{ selector: `np-textarea`, template: "<div id=\"np-textarea-wrapper\" class=\"np-textarea-wrapper np-row\">\r\n <div class=\"np-column np-lbl-container\" *ngIf=\"label\">\r\n <label for=\"np-textarea\" class=\"np-textarea-lbl\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n </div>\r\n <div class=\"np-column np-textarea-container\">\r\n <textarea class=\"np-textarea\" id=\"np-textarea\" [(ngModel)]=\"val\" [placeholder]=\"placeholder\" [attr.disabled]=\"isDisabled ? '' : null\"\r\n [class.disabled]=\"isDisabled\" (change)=\"onChange($event)\" (keyup)=\"onChange($event)\" cols=\"30\" rows=\"10\" >\r\n </textarea>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"np-len\" *ngIf=\"maxLen > -1 && maxLen < 1000\">\r\n <span class=\"cur-length\">{{ currentLen }}</span> / <span>{{ maxLen }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => NpTextarea)), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef((/** * @return {?} */ () => NpTextarea)), multi: true, } ], styles: [".flex-wrap{display:flex}.col-flex{flex-direction:column}.row-flex{flex-direction:row}.middle-flex{justify-content:center;align-items:center}.np-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.np-column{display:flex;flex-direction:column;flex-basis:100%;flex:1}.backdrop-transparent{opacity:0}#np-textarea-wrapper{align-items:baseline}#np-textarea-wrapper .np-lbl-container{flex:0}#np-textarea-wrapper .np-lbl-container .np-textarea-lbl{width:80px;margin-right:20px;text-align:right;font-size:13px;font-weight:700}#np-textarea-wrapper .np-textarea-container{position:relative}#np-textarea-wrapper .np-textarea-container .np-textarea{box-sizing:border-box;background-image:none;border-radius:1px;display:inline-block;padding:5px 10px;margin:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%;height:83px;line-height:20px}#np-textarea-wrapper .np-textarea-container .np-textarea:focus{outline:0!important;outline-offset:unset;border-width:1px}#np-textarea-wrapper .np-textarea-container .error-message{display:block;font-size:10px;margin:5px}#np-textarea-wrapper .np-textarea-container .np-len{position:absolute;right:5px;height:34px;line-height:34px;font-size:14px;z-index:1000}"] }] } ]; /** @nocollapse */ NpTextarea.ctorParameters = () => []; NpTextarea.propDecorators = { label: [{ type: Input }], isRequired: [{ type: Input }], placeholder: [{ type: Input }], errorMessage: [{ type: Input }], isDisabled: [{ type: Input }], maxLen: [{ type: Input }], numberOnly: [{ type: Input }], onKeyup: [{ type: HostListener, args: ['keyup', ['$event'],] }], onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }], onPaste: [{ type: HostListener, args: ['paste', ['$event'],] }] }; if (false) { /** @type {?} */ NpTextarea.prototype.val; /** * @type {?} * @private */ NpTextarea.prototype.navigationKeys; /** @type {?} */ NpTextarea.prototype.currentLen; /** @type {?} */ NpTextarea.prototype.chineseReg; /** * 标签 * @type {?} */ NpTextarea.prototype.label; /** * 是否必填 - 必填则有红色*号在标签前面;否则没有 * @type {?} */ NpTextarea.prototype.isRequired; /** * 占位符 * @type {?} */ NpTextarea.prototype.placeholder; /** * 错误信息 - 将以红色字体显示在输入框下方 * @type {?} */ NpTextarea.prototype.errorMessage; /** * 是否禁用 * @type {?} */ NpTextarea.prototype.isDisabled; /** * 最大长度 * * Default -1 indicate that the length of input is not limited * The max of maxLen is 999 * @type {?} */ NpTextarea.prototype.maxLen; /** * 只允许填写数字 * @type {?} */ NpTextarea.prototype.numberOnly; /** * @type {?} * @private */ NpTextarea.prototype.emitChange; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdGV4dGFyZWEvdGV4dGFyZWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQTJCLEtBQUssRUFBVSxVQUFVLEVBQStDLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFzRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUF5QnRJLE1BQU0sT0FBTyxVQUFVO0lBMkNyQjtRQXZDUSxtQkFBYyxHQUFHO1lBQ3ZCLFdBQVc7WUFDWCxRQUFRO1lBQ1IsS0FBSztZQUNMLFFBQVE7WUFDUixPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxXQUFXO1lBQ1gsWUFBWTtZQUNaLE9BQU87WUFDUCxNQUFNO1lBQ04sT0FBTztTQUNSLENBQUM7UUFDRixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxlQUFlLENBQUM7Ozs7UUFPcEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7Ozs7Ozs7UUFZekIsV0FBTSxHQUFXLENBQUMsQ0FBQyxDQUFDOzs7O1FBRXBCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDN0IsZUFBVTs7OztRQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUM7SUFFckIsQ0FBQzs7OztJQUVqQixRQUFRO0lBRVIsQ0FBQzs7OztJQUVELGVBQWU7SUFDZixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sRUFBRTtTQUVaO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxRQUFRLENBQUMsS0FBVTs7WUFDYixRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFHNUIsQ0FBQzs7Ozs7SUFFRCxV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TCxLQUFLO3NCQTZDTCxZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO3dCQXlCaEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztzQkFrQ2xDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUE3SWpDLHlCQUFZOzs7OztJQUNaLG9DQWFFOztJQUNGLGdDQUF1Qjs7SUFDdkIsZ0NBQTZCOzs7OztJQUc3QiwyQkFBdUI7Ozs7O0lBRXZCLGdDQUE2Qjs7Ozs7SUFFN0IsaUNBQWtDOzs7OztJQUVsQyxrQ0FBOEI7Ozs7O0lBRTlCLGdDQUE2Qjs7Ozs7Ozs7SUFRN0IsNEJBQTZCOzs7OztJQUU3QixnQ0FBcUM7Ozs7O0lBQ3JDLGdDQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgT25Jbml0LCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgTkdfVkFMSURBVE9SUywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgVmFsaWRhdGlvbkVycm9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKipcclxuICog5aSa6KGM5paH5pys6L6T5YWl5qGGXHJcbiAqIFxyXG4gKiA8ZXhhbXBsZS11cmw+aHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L25wLXRleHRhcmVhLWV4YW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtdGV4dGFyZWFgLFxyXG4gIHRlbXBsYXRlVXJsOiAndGV4dGFyZWEuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ3RleHRhcmVhLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBUZXh0YXJlYSksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBUZXh0YXJlYSksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcFRleHRhcmVhIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG5cclxuXHJcbiAgdmFsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uS2V5cyA9IFtcclxuICAgICdCYWNrc3BhY2UnLFxyXG4gICAgJ0RlbGV0ZScsXHJcbiAgICAnVGFiJyxcclxuICAgICdFc2NhcGUnLFxyXG4gICAgJ0VudGVyJyxcclxuICAgICdIb21lJyxcclxuICAgICdFbmQnLFxyXG4gICAgJ0Fycm93TGVmdCcsXHJcbiAgICAnQXJyb3dSaWdodCcsXHJcbiAgICAnQ2xlYXInLFxyXG4gICAgJ0NvcHknLFxyXG4gICAgJ1Bhc3RlJ1xyXG4gIF07XHJcbiAgY3VycmVudExlbjogbnVtYmVyID0gMDtcclxuICBjaGluZXNlUmVnID0gL1teXFx4MDAtXFx4ZmZdL2c7XHJcblxyXG4gIC8qKuagh+etviAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm5b+F5aGrIC0g5b+F5aGr5YiZ5pyJ57qi6ImyKuWPt+WcqOagh+etvuWJjemdou+8m+WQpuWImeayoeaciSAqL1xyXG4gIEBJbnB1dCgpIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgLyoq5Y2g5L2N56ymICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKumUmeivr+S/oeaBryAtIOWwhuS7pee6ouiJsuWtl+S9k+aYvuekuuWcqOi+k+WFpeahhuS4i+aWuSAqL1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuemgeeUqCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIOacgOWkp+mVv+W6plxyXG4gICAqIFxyXG4gICAqIERlZmF1bHQgLTEgaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIG9mIGlucHV0IGlzIG5vdCBsaW1pdGVkXHJcbiAgICogVGhlIG1heCBvZiBtYXhMZW4gaXMgOTk5XHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4TGVuOiBudW1iZXIgPSAtMTtcclxuICAvKirlj6rlhYHorrjloavlhpnmlbDlrZcgKi9cclxuICBASW5wdXQoKSBudW1iZXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcykge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBuZXdWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShuZXdWYWx1ZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChvYmogfHwgb2JqID09PSAnJykge1xyXG4gICAgICB0aGlzLnZhbCA9IG9iajtcclxuICAgICAgaWYgKHRoaXMubWF4TGVuID4gLTEpIHtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnRMZW4oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcclxuICAgIC8vIFRPRE86IGN1c3RvbWl6ZSB2YWxpZGF0aW9uXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcclxuICBvbktleXVwKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLm1heExlbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1heExlbiA+IC0xKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudExlbigpO1xyXG5cclxuICAgICAgLy8gSGFjazogd2hlbiB0eXBpbmcgY2hpbmVzZSBjaGFyYWN0ZXIsIGlucHV0IGNvbnRyb2wgd2lsbCBub3QgcHJldmVudCB0aGUgY2hhcmFjdGVyIHR5cGluZ1xyXG4gICAgICBsZXQgY2hpbmVzZUNoYXJMZW4gPSB0aGlzLnZhbCA/ICh0aGlzLnZhbC5tYXRjaCh0aGlzLmNoaW5lc2VSZWcpIHx8IFtdKSA6IFtdO1xyXG4gICAgICBpZiAoY2hpbmVzZUNoYXJMZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc3Vic3RyaW5nKDAsIHRoaXMubWF4TGVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm51bWJlck9ubHkpIHtcclxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA/IHRoaXMudmFsLnJlcGxhY2UodGhpcy5jaGluZXNlUmVnLCAnJykgOiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUcmlnZ2VyS2V5RXZlbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4TGVuICE9PSAtMSB8fCB0aGlzLm51bWJlck9ubHk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVHJpZ2dlcktleUV2ZW50cygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbktleXMuaW5kZXhPZihlLmtleSkgPiAtMSB8fCAgLy8gQWxsb3c6IG5hdmlnYXRpb24ga2V5czogYmFja3NwYWNlLCBkZWxldGUsIGFycm93cyBldGMuXHJcbiAgICAgIChlLmtleSA9PT0gJ2EnICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgICAgLy8gQWxsb3c6IEN0cmwrQVxyXG4gICAgICAoZS5rZXkgPT09ICdjJyAmJiBlLmN0cmxLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDdHJsK0NcclxuICAgICAgKGUua2V5ID09PSAndicgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAgICAvLyBBbGxvdzogQ3RybCtWXHJcbiAgICAgIChlLmtleSA9PT0gJ3gnICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgICAgLy8gQWxsb3c6IEN0cmwrWFxyXG4gICAgICAoZS5rZXkgPT09ICdhJyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrQSAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICdjJyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrQyAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICd2JyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrViAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICd4JyAmJiBlLm1ldGFLZXkgPT09IHRydWUpICAgICAgIC8vIEFsbG93OiBDbWQrWCAoTWFjKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tYXhMZW4gPiAtMSkge1xyXG4gICAgICBsZXQgaGlnaHRsaWdodFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkgKyAnJztcclxuICAgICAgaWYgKHRoaXMudmFsICYmIHRoaXMudmFsLmxlbmd0aCA+PSB0aGlzLm1heExlbiAmJiBoaWdodGxpZ2h0VGV4dCA9PT0gJycpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5udW1iZXJPbmx5KSB7XHJcbiAgICAgIGlmIChpc05hTihOdW1iZXIoZS5rZXkpKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxyXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNUcmlnZ2VyS2V5RXZlbnRzKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgbGV0IGN1cnJlbnRWYWwgPSB0aGlzLnZhbDtcclxuICAgIGlmICh0aGlzLm1heExlbiA+IC0xIHx8IHRoaXMubnVtYmVyT25seSkge1xyXG4gICAgICBsZXQgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgaWYgKHRoaXMubnVtYmVyT25seSkge1xyXG4gICAgICAgIGxldCBwYXN0ZWRJbnB1dDogc3RyaW5nID0gY2xpcGJvYXJkRGF0YS5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBnZXQgYSBudW1iZXItb25seSBzdHJpbmdcclxuICAgICAgICB0aGlzLnZhbCA9IGN1cnJlbnRWYWwgKyBwYXN0ZWRJbnB1dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubWF4TGVuID4gLTEpIHtcclxuICAgICAgICBsZXQgcGFzdGVkSW5wdXQ6IHN0cmluZyA9IGNsaXBib2FyZERhdGEuc3Vic3RyaW5nKDAsIHRoaXMubWF4TGVuKTtcclxuICAgICAgICB0aGlzLnZhbCA9IGN1cnJlbnRWYWwgKyBwYXN0ZWRJbnB1dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNhbGN1bGF0ZUN1cnJlbnRMZW4oKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRMZW4gPSB0aGlzLnZhbCA/IHRoaXMudmFsLmxlbmd0aCA6IDA7XHJcbiAgICB0aGlzLmN1cnJlbnRMZW4gPSB0aGlzLmN1cnJlbnRMZW4gPiB0aGlzLm1heExlbiA/IHRoaXMubWF4TGVuIDogdGhpcy5jdXJyZW50TGVuO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==