UNPKG

ngx-form-control

Version:
364 lines (360 loc) 36.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, Input, ViewChild } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { BaseListControlComponent } from '../../utils/base-list-control.component'; import { Common } from '../../utils/common'; export class FormSelect2Component extends BaseListControlComponent { constructor() { super(...arguments); this._isTouched = false; } /** * @param {?} value * @return {?} */ set placeholder(value) { this._placeholder = value; this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ set required(value) { this._required = value; this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = value; this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ set multiple(value) { this._multiple = value; this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ set tag(value) { this._tag = value; this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ set tokenSeparators(value) { this._tag = value; this.updateSelect2Options(); } /** * @return {?} */ get value() { if (!this._selectedIndexes || !this._selectedIndexes.length) { return null; } /** @type {?} */ const result = this._selectedIndexes.reduce((currentResult, index) => { if (Number.isInteger(index) && this._selectOptions[index]) { currentResult.push(this._selectOptions[index].value); } else if (this._tag) { /** @type {?} */ const match = index['value'].match(/^number: {([\d]+)}$/); if (match) { currentResult.push(match[1]); } else { currentResult.push(index['value']); } } return currentResult; }, []); return this._multiple ? result : result[0]; } /** * @return {?} */ get invalid() { if (this.hasCustomError) { return true; } if (!this._isTouched) { return false; } return this.hasRequiredError; } /** * @return {?} */ get valid() { if (this.hasCustomError) { return false; } if (!this._isTouched) { return false; } return !this.hasRequiredError; } /** * @return {?} */ get errorMessages() { if (this.hasRequiredError) { return [this.requiredErrorMessage]; } if (this.hasCustomError) { return this.innerCustomErrorMessages; } } /** * @return {?} */ ngOnInit() { this.updateSelect2Options(); } /** * @param {?} value * @return {?} */ writeValue(value) { if (this._multiple && value && value.length) { this.selectValues(value); } else if (!this._multiple) { this.selectValue(value); } else { this.cleanValue(); } } /** * @return {?} */ validate() { /** @type {?} */ const result = {}; if (this.hasRequiredError) { result['required'] = true; } return result; } /** * @return {?} */ reset() { this._isTouched = false; } /** * @return {?} */ afterInitOptions() { this._selectOptions = [...this._selectOptions]; this.updateSelect2Options(); } /** * @param {?} values * @return {?} */ selectValues(values) { this._selectedIndexes = []; /** @type {?} */ const select2Data = []; if (values && values.length) { values.map((value) => { /** @type {?} */ const index = this.findIndex(value); if (index > -1) { this._selectedIndexes.push(index); select2Data.push(index); } else if (this._tag) { this._selectedIndexes.push({ value }); select2Data.push(value); } }); } if (Common.isClient()) { this._selectElement.val(select2Data); this._selectElement.trigger('change'); } } /** * @return {?} */ updateSelectedIndexes() { if (Common.isServer()) { return; } /** @type {?} */ const oldSelectedIndexes = JSON.stringify(this._selectedIndexes); /** @type {?} */ const value = this._selectElement.val(); if ('number' === typeof value || ('string' === typeof value && Number.isInteger(+value))) { this._selectedIndexes = [+value]; } else if ('string' === typeof value && this._tag) { this._selectedIndexes = [{ value }]; } else if (value && value.length) { this._selectedIndexes = value.map(item => { if (Number.isInteger(+item)) { return +item; } if (this._tag) { return { value: item }; } return null; }); } else { this._selectedIndexes = []; } /** @type {?} */ const newSelectedIndexes = JSON.stringify(this._selectedIndexes); if (newSelectedIndexes !== oldSelectedIndexes) { this.triggerChange(); } } /** * @param {?} value * @return {?} */ selectValue(value) { if (Common.isServer()) { return; } /** @type {?} */ const index = this.findIndex(value); if (index > -1) { this._selectedIndexes = [index]; this._selectElement.val(this._selectedIndexes); this._selectElement.trigger('change'); } else if (this._tag) { this._selectedIndexes = [{ value }]; this._selectElement.val(value); this._selectElement.trigger('change'); } else { this.cleanValue(); } } /** * @return {?} */ cleanValue() { if (Common.isServer()) { return; } this._selectedIndexes = []; this._selectElement.val(null); this._selectElement.trigger('change'); } /** * @return {?} */ updateSelect2Options() { if (Common.isServer() || !this.customSelectElement || !this.customSelectElement.nativeElement) { return; } this._selectElement = $(this.customSelectElement.nativeElement); if (this._selectElement.hasClass('select2-hidden-accessible')) { this._selectElement.select2().empty(); this._selectElement.select2('destroy'); } this._selectElement.select2({ tags: this._tag, tokenSeparators: this._tokenSeparators || [], placeholder: this._placeholder, allowClear: !this._required, multiple: this._multiple, data: this._selectOptions, disabled: this._disabled, createTag: function (params) { /** @type {?} */ const term = $.trim(params.term); if (term === '') { return null; } return { id: Number.isInteger(+term) ? `number: {${term}}` : term, text: term, newTag: true }; } }); this._selectElement.on('select2:select', () => { this.updateSelectedIndexes(); }); this._selectElement.on('select2:unselect', () => { this.updateSelectedIndexes(); }); this._selectElement.on('select2:close', () => { this._isTouched = true; }); } } FormSelect2Component.decorators = [ { type: Component, args: [{ selector: 'ngx-form-select2', template: `<label *ngIf="label" [for]="id">{{label}}</label> <div class="form-control is-invalid" [ngClass]="{'is-invalid': invalid, 'is-valid': valid}"> <!--suppress HtmlFormInputWithoutLabel --> <select [id]="id" #customSelectElement></select> </div> <div class="valid-feedback" *ngIf="valid && validMessage">{{validMessage}}</div> <div class="invalid-feedback" *ngIf="invalid"> <span *ngFor="let message of errorMessages; let last = last;"> {{message}}<br *ngIf="!last"> </span> </div> `, styles: [`:host .form-control{padding:0}:host .form-control /deep/ .select2-container{width:100%!important}:host .form-control /deep/ .select2-container .select2-selection--single{height:auto}:host .form-control /deep/ .select2-container--default .select2-selection--multiple,:host .form-control /deep/ .select2-container--default .select2-selection--single,:host .form-control /deep/ .select2-container--default.select2-container--focus .select2-selection--multiple{border:none;outline:0!important}:host .form-control /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control /deep/ .select2-container--default .select2-selection--single:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__rendered{min-height:40px;line-height:25px;padding:.375rem 25px .375rem .75rem}:host .form-control /deep/ .select2-container .select2-selection--multiple{min-height:40px;padding:.375rem .75rem}:host .form-control /deep/ .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding:0}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__arrow{height:38px}`], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: FormSelect2Component, multi: true }, { provide: NG_VALIDATORS, useExisting: FormSelect2Component, multi: true } ] },] }, ]; FormSelect2Component.propDecorators = { customSelectElement: [{ type: ViewChild, args: ['customSelectElement',] }], placeholder: [{ type: Input }], required: [{ type: Input }], disabled: [{ type: Input }], multiple: [{ type: Input }], tag: [{ type: Input }], tokenSeparators: [{ type: Input }] }; if (false) { /** @type {?} */ FormSelect2Component.prototype._selectElement; /** @type {?} */ FormSelect2Component.prototype._isTouched; /** @type {?} */ FormSelect2Component.prototype._placeholder; /** @type {?} */ FormSelect2Component.prototype.customSelectElement; /** @type {?} */ FormSelect2Component.prototype._required; /** @type {?} */ FormSelect2Component.prototype._disabled; /** @type {?} */ FormSelect2Component.prototype._tag; /** @type {?} */ FormSelect2Component.prototype._tokenSeparators; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3QyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mb3JtLWNvbnRyb2wvIiwic291cmNlcyI6WyJsaWIvZm9ybS1zZWxlY3QyL2Zvcm0tc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQTJCMUMsTUFBTSwyQkFBNEIsU0FBUSx3QkFBd0I7OzswQkFHM0MsS0FBSzs7Ozs7O0lBSzFCLElBQWEsV0FBVyxDQUFDLEtBQWE7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDN0I7Ozs7O0lBSUQsSUFBYSxRQUFRLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztLQUM3Qjs7Ozs7SUFJRCxJQUFhLFFBQVEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0tBQzdCOzs7OztJQUVELElBQWEsUUFBUSxDQUFDLEtBQWM7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDN0I7Ozs7O0lBSUQsSUFBYSxHQUFHLENBQUMsS0FBYztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFH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VixNQUFNLEVBQUUsSUFBSTtpQkFDYixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7WUFDNUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEIsQ0FBQyxDQUFDOzs7O1lBdlNOLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7O0NBY1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsa3dEQUFrd0QsQ0FBQztnQkFDNXdELFNBQVMsRUFBRTtvQkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztvQkFDNUUsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUN6RTthQUNGOzs7a0NBT0UsU0FBUyxTQUFDLHFCQUFxQjswQkFFL0IsS0FBSzt1QkFPTCxLQUFLO3VCQU9MLEtBQUs7dUJBS0wsS0FBSztrQkFPTCxLQUFLOzhCQU9MLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0Jhc2VMaXN0Q29udHJvbENvbXBvbmVudH0gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZS1saXN0LWNvbnRyb2wuY29tcG9uZW50JztcclxuaW1wb3J0IHtDb21tb259IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbic7XHJcblxyXG5kZWNsYXJlIGNvbnN0ICQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1mb3JtLXNlbGVjdDInLFxyXG4gIHRlbXBsYXRlOiBgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuXHJcbjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaXMtaW52YWxpZFwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCc6IGludmFsaWQsICdpcy12YWxpZCc6IHZhbGlkfVwiPlxyXG4gIDwhLS1zdXBwcmVzcyBIdG1sRm9ybUlucHV0V2l0aG91dExhYmVsIC0tPlxyXG4gIDxzZWxlY3QgW2lkXT1cImlkXCIgI2N1c3RvbVNlbGVjdEVsZW1lbnQ+PC9zZWxlY3Q+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cInZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJ2YWxpZCAmJiB2YWxpZE1lc3NhZ2VcIj57e3ZhbGlkTWVzc2FnZX19PC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiaW52YWxpZFwiPlxyXG4gIDxzcGFuICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIGVycm9yTWVzc2FnZXM7IGxldCBsYXN0ID0gbGFzdDtcIj5cclxuICAgIHt7bWVzc2FnZX19PGJyICpuZ0lmPVwiIWxhc3RcIj5cclxuICA8L3NwYW4+XHJcbjwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2A6aG9zdCAuZm9ybS1jb250cm9se3BhZGRpbmc6MH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXJ7d2lkdGg6MTAwJSFpbXBvcnRhbnR9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyIC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xle2hlaWdodDphdXRvfTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZSw6aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQuc2VsZWN0Mi1jb250YWluZXItLWZvY3VzIC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGV7Ym9yZGVyOm5vbmU7b3V0bGluZTowIWltcG9ydGFudH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZTpmb2N1cyw6aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGU6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4MGJkZmY7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuMjUpfTpob3N0IC5mb3JtLWNvbnRyb2wuaXMtaW52YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGU6Zm9jdXMsOmhvc3QgLmZvcm0tY29udHJvbC5pcy1pbnZhbGlkIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGU6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNkYzM1NDU7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDIyMCw1Myw2OSwuMjUpfTpob3N0IC5mb3JtLWNvbnRyb2wuaXMtdmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlOmZvY3VzLDpob3N0IC5mb3JtLWNvbnRyb2wuaXMtdmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6IzI4YTc0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWR7bWluLWhlaWdodDo0MHB4O2xpbmUtaGVpZ2h0OjI1cHg7cGFkZGluZzouMzc1cmVtIDI1cHggLjM3NXJlbSAuNzVyZW19Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyIC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGV7bWluLWhlaWdodDo0MHB4O3BhZGRpbmc6LjM3NXJlbSAuNzVyZW19Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGUgLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZHtwYWRkaW5nOjB9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlIC5zZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3d7aGVpZ2h0OjM4cHh9YF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBGb3JtU2VsZWN0MkNvbXBvbmVudCwgbXVsdGk6IHRydWV9LFxyXG4gICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBGb3JtU2VsZWN0MkNvbXBvbmVudCwgbXVsdGk6IHRydWV9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybVNlbGVjdDJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTGlzdENvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RFbGVtZW50O1xyXG4gIHByaXZhdGUgX2lzVG91Y2hlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbVNlbGVjdEVsZW1lbnQnKSBjdXN0b21TZWxlY3RFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGFnOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgdGFnKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl90YWcgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rva2VuU2VwYXJhdG9yczogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgc2V0IHRva2VuU2VwYXJhdG9ycyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdGFnID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRJbmRleGVzIHx8ICF0aGlzLl9zZWxlY3RlZEluZGV4ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3NlbGVjdGVkSW5kZXhlcy5yZWR1Y2UoKGN1cnJlbnRSZXN1bHQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiB0aGlzLl9zZWxlY3RPcHRpb25zW2luZGV4XSkge1xyXG4gICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaCh0aGlzLl9zZWxlY3RPcHRpb25zW2luZGV4XS52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbmRleFsndmFsdWUnXS5tYXRjaCgvXm51bWJlcjogeyhbXFxkXSspfSQvKTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobWF0Y2hbMV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2goaW5kZXhbJ3ZhbHVlJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XHJcbiAgICB9LCBbXSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlID8gcmVzdWx0IDogcmVzdWx0WzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzVG91Y2hlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGFzUmVxdWlyZWRFcnJvcjtcclxuICB9XHJcblxyXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzVG91Y2hlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICF0aGlzLmhhc1JlcXVpcmVkRXJyb3I7XHJcbiAgfVxyXG5cclxuICBnZXQgZXJyb3JNZXNzYWdlcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IpIHtcclxuICAgICAgcmV0dXJuIFt0aGlzLnJlcXVpcmVkRXJyb3JNZXNzYWdlXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbm5lckN1c3RvbUVycm9yTWVzc2FnZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSB8IEFycmF5PGFueT4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9tdWx0aXBsZSAmJiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RWYWx1ZXModmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5fbXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFuVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKCk6IHt9IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IpIHtcclxuICAgICAgcmVzdWx0WydyZXF1aXJlZCddID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8gbm9pbnNwZWN0aW9uIEpTVW51c2VkR2xvYmFsU3ltYm9sc1xyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5faXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWZ0ZXJJbml0T3B0aW9ucygpIHtcclxuICAgIHRoaXMuX3NlbGVjdE9wdGlvbnMgPSBbLi4udGhpcy5fc2VsZWN0T3B0aW9uc107XHJcblxyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RWYWx1ZXModmFsdWVzKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbXTtcclxuICAgIGNvbnN0IHNlbGVjdDJEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRJbmRleCh2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICBzZWxlY3QyRGF0YS5wdXNoKGluZGV4KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZykge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzLnB1c2goe3ZhbHVlfSk7XHJcbiAgICAgICAgICBzZWxlY3QyRGF0YS5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDb21tb24uaXNDbGllbnQoKSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbChzZWxlY3QyRGF0YSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkSW5kZXhlcygpIHtcclxuICAgIGlmIChDb21tb24uaXNTZXJ2ZXIoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2xkU2VsZWN0ZWRJbmRleGVzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRJbmRleGVzKTtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc2VsZWN0RWxlbWVudC52YWwoKTtcclxuXHJcbiAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiB2YWx1ZSB8fCAoJ3N0cmluZycgPT09IHR5cGVvZiB2YWx1ZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKCt2YWx1ZSkpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFsrdmFsdWVdO1xyXG4gICAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHZhbHVlICYmIHRoaXMuX3RhZykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbe3ZhbHVlfV07XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoK2l0ZW0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gK2l0ZW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBpdGVtfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1NlbGVjdGVkSW5kZXhlcyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkSW5kZXhlcyk7XHJcblxyXG4gICAgaWYgKG5ld1NlbGVjdGVkSW5kZXhlcyAhPT0gb2xkU2VsZWN0ZWRJbmRleGVzKSB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RWYWx1ZSh2YWx1ZSkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmluZEluZGV4KHZhbHVlKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbaW5kZXhdO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCh0aGlzLl9zZWxlY3RlZEluZGV4ZXMpO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW3t2YWx1ZX1dO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFuVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW5WYWx1ZSgpIHtcclxuICAgIGlmIChDb21tb24uaXNTZXJ2ZXIoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW107XHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbChudWxsKTtcclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdDJPcHRpb25zKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpIHx8ICF0aGlzLmN1c3RvbVNlbGVjdEVsZW1lbnQgfHwgIXRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50ID0gJCh0aGlzLmN1c3RvbVNlbGVjdEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0RWxlbWVudC5oYXNDbGFzcygnc2VsZWN0Mi1oaWRkZW4tYWNjZXNzaWJsZScpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0MigpLmVtcHR5KCk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0MignZGVzdHJveScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0Mih7XHJcbiAgICAgIHRhZ3M6IHRoaXMuX3RhZyxcclxuICAgICAgdG9rZW5TZXBhcmF0b3JzOiB0aGlzLl90b2tlblNlcGFyYXRvcnMgfHwgW10sXHJcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLl9wbGFjZWhvbGRlcixcclxuICAgICAgYWxsb3dDbGVhcjogIXRoaXMuX3JlcXVpcmVkLFxyXG4gICAgICBtdWx0aXBsZTogdGhpcy5fbXVsdGlwbGUsXHJcbiAgICAgIGRhdGE6IHRoaXMuX3NlbGVjdE9wdGlvbnMsXHJcbiAgICAgIGRpc2FibGVkOiB0aGlzLl9kaXNhYmxlZCxcclxuICAgICAgY3JlYXRlVGFnOiBmdW5jdGlvbiAocGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgdGVybSA9ICQudHJpbShwYXJhbXMudGVybSk7XHJcblxyXG4gICAgICAgIGlmICh0ZXJtID09PSAnJykge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaWQ6IE51bWJlci5pc0ludGVnZXIoK3Rlcm0pID8gYG51bWJlcjogeyR7dGVybX19YCA6IHRlcm0sXHJcbiAgICAgICAgICB0ZXh0OiB0ZXJtLFxyXG4gICAgICAgICAgbmV3VGFnOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5vbignc2VsZWN0MjpzZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleGVzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOnVuc2VsZWN0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSW5kZXhlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5vbignc2VsZWN0MjpjbG9zZScsICgpID0+IHtcclxuICAgICAgdGhpcy5faXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuIl19