UNPKG

ngx-selectbox-may

Version:

Angular selectbox with autocomplete

447 lines 39.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ElementRef, ViewChild, ViewChildren, QueryList, forwardRef, Output, EventEmitter, ContentChild, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NgxSelectboxMayService } from './ngx-selectbox-may.service'; import { NGXSelectMayConfigs } from './ngx-selectbox-may-configs'; export class NgxSelectboxMayComponent { /** * @param {?} _selectboxref * @param {?} selectboxService */ constructor(_selectboxref, selectboxService) { this._selectboxref = _selectboxref; this.selectboxService = selectboxService; this.dropdownRows = []; this.configs = new NGXSelectMayConfigs(); this.selectedRows = []; this.show_items = false; this.searchText = ""; this.isEnable = true; this.propagateChange = (_) => { }; this.propagateOnTouch = (_) => { }; this.onKeyUp = new EventEmitter(); this.onSelect = new EventEmitter(); this.onBlur = new EventEmitter(); } /** * @param {?} items * @return {?} */ set items(items) { this.createDropdownRows(items); } /** * @param {?} cssClass * @return {?} */ set cssClass(cssClass) { this.configs.cssClass = cssClass; } /** * @param {?} valueField * @return {?} */ set valueField(valueField) { this.configs.valueField = valueField; } /** * @param {?} labelField * @return {?} */ set labelField(labelField) { this.configs.labelField = labelField; this.reconfigureLabelsAndValues(); } /** * @param {?} placeholder * @return {?} */ set placeholder(placeholder) { this.configs.placeholderText = placeholder; } /** * @param {?} emptyText * @return {?} */ set emptyText(emptyText) { this.configs.emptyText = emptyText; } /** * @param {?} showEmptyText * @return {?} */ set showEmptyResultText(showEmptyText) { this.configs.showEmptyResultsLabel = showEmptyText; } /** * @param {?} isMulti * @return {?} */ set isMulti(isMulti) { this.configs.isMultiSelect = isMulti; } /** * @param {?} isLoading * @return {?} */ set isLoading(isLoading) { this._isLoading = isLoading; } /** * @param {?} loadingText * @return {?} */ set loadingText(loadingText) { this._loadingText = loadingText; } /** * @return {?} */ ngOnInit() { } /** * @param {?} items * @return {?} */ createDropdownRows(items) { this.dropdownRows = this.selectboxService.createDropdownRows(items, this.configs); this.setValuesPassedExternal(this.ngModelValue); } /** * @return {?} */ reconfigureLabelsAndValues() { this.selectboxService.reconfigureDropdownRowLabelsAndValues(this.dropdownRows, this.configs); } /** * @return {?} */ getSelectboxLabel() { /** @type {?} */ let label = this.selectboxService.createDropdownLabel(this.configs, this.selectedRows); return label ? label : this.configs.placeholderText; } /** * @return {?} */ getEmptyTextLabel() { return this.configs.emptyText ? this.configs.emptyText : NGXSelectMayConfigs.EMPTY_TEXT; } /** * @return {?} */ getLoadingText() { return this._loadingText ? this._loadingText : NGXSelectMayConfigs.LOADING_TEXT; } /** * @return {?} */ onClickSelectBox() { this.showItemsWindow(); } /** * @return {?} */ getActiveClass() { return NGXSelectMayConfigs.ROW_ACTIVE_CLASS; } /** * @return {?} */ showItemsWindow() { this.show_items = true; } /** * @return {?} */ hideItemsWindow() { this.onBlur.emit(this.searchText); this.resetFilters(); this.show_items = false; } /** * @return {?} */ onRemoveClick() { this.selectboxService.unselectAllSelectedRows(this.dropdownRows); this.selectedRows = []; this.publishValue(); } /** * @param {?} e * @return {?} */ onSearchKeydown(e) { if (e.key == "Escape") { this.hideItemsWindow(); } //Up and Down arrow events if (e.keyCode == 38 || e.keyCode == 40) { e.preventDefault(); } } /** * @param {?} e * @return {?} */ onSearchKeyup(e) { if (e.keyCode == 38 || e.keyCode == 40 || e.key == "Escape") { e.preventDefault(); } else { this.onKeyUp.emit(this.searchText); } } /** * @return {?} */ resetFilters() { this.searchText = ""; } /** * @param {?} row * @param {?} index * @return {?} */ onClickItem(row, index) { if (this.configs.isMultiSelect) { } else { this.selectedRows = this.selectboxService.setSelectedItems(this.configs, this.selectedRows, this.dropdownRows, row); this.onSelect.emit(row.data); this.hideItemsWindow(); } this.publishValue(); } /** * @return {?} */ publishValue() { /** @type {?} */ let values = this.selectedRows.map(r => r.value); if (this.configs.isMultiSelect) { this.propagateChange(values); } else { this.propagateChange(values.length > 0 ? values[0] : ""); } } /** * @param {?} obj * @return {?} */ setValuesPassedExternal(obj) { if (this.configs.isMultiSelect) { this.selectedRows = this.selectboxService.selectItemsByValue(this.dropdownRows, obj); } else { this.selectedRows = this.selectboxService.selectItemByValue(this.dropdownRows, obj); } } /* * * On Item browse open window begin & document outside click event Begins * */ /** * @param {?} content * @return {?} */ set content(content) { this.itemWindow = content; // this.positionWindow(); this.focusToSearchField(); this.scrollToSelectedItem(); } /** * @return {?} */ positionWindow() { if (this.searchField) { /** @type {?} */ const selectBoxRef = this._selectboxref.nativeElement; /** @type {?} */ var viewportOffset = selectBoxRef.getBoundingClientRect(); console.log(viewportOffset); this.itemWindow.nativeElement.setAttribute('style', 'width: ' + (selectBoxRef.firstChild.offsetWidth + 3) + 'px; top: ' + (viewportOffset.top - 5) + 'px; margin-left: -12px;'); } } /** * @return {?} */ focusToSearchField() { if (this.searchField) { this.searchField.nativeElement.focus(); } } /** * @return {?} */ scrollToSelectedItem() { this.listItems.forEach(li => { if (li.nativeElement.classList.contains(NGXSelectMayConfigs.ROW_ACTIVE_CLASS)) { /** @type {?} */ const scrollLi = li.nativeElement; this.itemWindow.nativeElement.getElementsByTagName("ul")[0].scrollTop = scrollLi.offsetTop - (scrollLi.offsetHeight + 20); } }); } /** * @param {?} e * @return {?} */ onClickOutside(e) { if (!this._selectboxref.nativeElement.contains(event.target) && this.show_items) { this.hideItemsWindow(); } } /** * @param {?} e * @return {?} */ onWindowResize(e) { // this.positionWindow(); } /** * @return {?} */ setDisable() { this.hideItemsWindow(); this.isEnable = false; } /** * @return {?} */ setEnable() { this.isEnable = true; } /** * @param {?} obj * @return {?} */ writeValue(obj) { this.ngModelValue = obj; this.setValuesPassedExternal(obj); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.propagateOnTouch = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { console.log(isDisabled, "set disable"); if (isDisabled) { this.setDisable(); } else { this.setEnable(); } } } NgxSelectboxMayComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-selectbox-may', host: { '(document:click)': 'onClickOutside($event)', '(window:resize)': 'onWindowResize($event)' }, template: "<div [ngClass]=\"configs.cssClass\" class=\"__ngx-selectbox-may\">\n <span class=\"__selected-label\">\n <span>{{getSelectboxLabel()}}</span>\n </span>\n <div *ngIf=\"_isLoading\" class=\"__loading-text\">{{getLoadingText()}}</div>\n <div class=\"__clickable-area\" (click)=\"onClickSelectBox()\"></div>\n <button *ngIf=\"selectedRows.length>0 && isEnable\" type=\"button\" class=\"__remove-selected-btn\" (click)=\"onRemoveClick()\">\n <i></i>\n </button>\n <div *ngIf=\"show_items\" class=\"__item-list-browser\" #item_window>\n <div class=\"__item-search\">\n <input #search_field type=\"text\" max-length=\"15\" (keydown)=\"onSearchKeydown($event)\"\n (keyup)=\"onSearchKeyup($event)\" placeholder=\"search\" [(ngModel)]=\"searchText\" />\n </div>\n <ng-container *ngTemplateOutlet=\"actionTemplate\"></ng-container>\n <ul class=\"__ngx-selectbox-ul\">\n <ng-container *ngFor=\"let item of dropdownRows | ngx_item_filter:searchText; let i = index; let l = count\">\n <li #li_item *ngIf=\"l>0\" (click)=\"onClickItem(item, i)\" [ngClass]=\"item.isSelected ? getActiveClass() : ''\">\n {{item.label}}\n </li>\n </ng-container>\n <li class=\"__empty-items\"\n *ngIf=\"(dropdownRows | ngx_item_filter:searchText).length === 0 && configs.showEmptyResultsLabel\">\n {{getEmptyTextLabel()}}\n </li>\n </ul>\n </div>\n <div *ngIf=\"!isEnable\" class=\"__disabled-mask\"></div>\n</div>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxSelectboxMayComponent), multi: true, } ], styles: [".__ngx-selectbox-may{position:relative;min-width:200px;padding:3px 40px 3px 10px;display:flex;align-items:center;cursor:pointer;background-color:#fff}.__ngx-selectbox-may .__disabled-mask{position:absolute;background-color:rgba(0,0,0,.15);top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may::before{content:\"\\f107\";position:absolute;font-family:FontAwesome;color:#3f495b;right:10px;top:0;bottom:0;display:flex;align-items:center;font-size:14px}.__ngx-selectbox-may .__selected-label{position:relative;display:block;width:100%;text-align:left;height:19px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.__ngx-selectbox-may .__remove-selected-btn{background-color:transparent;border:0;outline:0;cursor:pointer;position:absolute;right:20px;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__clickable-area{position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may .__remove-selected-btn i::before{content:\"\\f00d\";font-family:FontAwesome;font-style:normal!important;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__selected-label .__remove-selected-btn::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;top:0;bottom:0;display:flex;align-items:center;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__item-list-browser{position:absolute;background-color:#fff;border-radius:4px;border:1px solid #dfe3e9;box-shadow:0 3px 18px -6px rgba(0,0,0,.5);z-index:1;top:-2px;left:-2px;right:-2px}.__ngx-selectbox-may .__item-list-browser ul{max-height:200px;overflow-y:auto;padding:0;margin:0;border-top:1px solid #dfe3e9}.__ngx-selectbox-may .__item-list-browser ul li{color:#777;font-size:13px;text-align:left;padding:9px 24px 9px 12px;border-bottom:1px solid #dfe3e9;cursor:pointer;line-height:17px}.__ngx-selectbox-may .__item-list-browser ul li.selected,.__ngx-selectbox-may .__item-list-browser ul li:hover{background-color:#f1f4f8;color:#2ea2f8}.__ngx-selectbox-may .__item-list-browser ul li.active{background-color:#f1f4f8;color:#2ea2f8;position:relative}.__ngx-selectbox-may .__item-list-browser ul li.active::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;-webkit-text-stroke:.5px #f1f4f8;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser ul li.__empty-items{color:#ff7f74;background-color:#fff4f4;cursor:auto}.__ngx-selectbox-may .__item-list-browser ul li:last-child{border-bottom:none}.__ngx-selectbox-may .__item-list-browser .__item-search{padding:5px;display:flex;position:relative}.__ngx-selectbox-may .__item-list-browser .__item-search::before{content:\"\\f002\";position:absolute;font-family:FontAwesome;right:16px;-webkit-text-stroke:.5px #fff;color:#ced0da;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]{width:100%;border:1px solid #dfe3e9;border-radius:4px;padding:8px 30px 8px 10px;outline:0}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]:focus{border:1px solid #2ea2f8;box-shadow:0 0 0 3px #2ea2f84d}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar{width:11px;height:18px}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-thumb{height:6px;border:3px solid transparent;background-clip:padding-box;-webkit-border-radius:7px;background-color:rgba(0,0,0,.15);-webkit-box-shadow:inset -1px -1px 0 rgba(0,0,0,.05) inset 1px 1px 0 rgba(0,0,0,.05)}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-button{width:0;height:0;display:none}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-corner{background-color:transparent}.__ngx-selectbox-may .__loading-text{position:absolute;background-color:#e5e5e5;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;padding-left:10px;border-radius:4px;z-index:2}"] }] } ]; /** @nocollapse */ NgxSelectboxMayComponent.ctorParameters = () => [ { type: ElementRef }, { type: NgxSelectboxMayService } ]; NgxSelectboxMayComponent.propDecorators = { items: [{ type: Input, args: ["items",] }], cssClass: [{ type: Input, args: ["css-class",] }], valueField: [{ type: Input, args: ["value-field",] }], labelField: [{ type: Input, args: ["label-field",] }], placeholder: [{ type: Input, args: ["placeholder",] }], emptyText: [{ type: Input, args: ["empty-text",] }], showEmptyResultText: [{ type: Input, args: ["show-empty-text",] }], isMulti: [{ type: Input, args: ["is-multi",] }], isLoading: [{ type: Input, args: ["is-loading",] }], loadingText: [{ type: Input, args: ["loading-text",] }], onKeyUp: [{ type: Output, args: ["search-keyup",] }], onSelect: [{ type: Output, args: ["on-select-item",] }], onBlur: [{ type: Output, args: ["on-blur",] }], searchField: [{ type: ViewChild, args: ['search_field',] }], listItems: [{ type: ViewChildren, args: ["li_item",] }], actionTemplate: [{ type: ContentChild, args: ['actionTemplate',] }], content: [{ type: ViewChild, args: ['item_window',] }] }; if (false) { /** @type {?} */ NgxSelectboxMayComponent.prototype.dropdownRows; /** @type {?} */ NgxSelectboxMayComponent.prototype.configs; /** @type {?} */ NgxSelectboxMayComponent.prototype.selectedRows; /** @type {?} */ NgxSelectboxMayComponent.prototype.show_items; /** @type {?} */ NgxSelectboxMayComponent.prototype.searchText; /** @type {?} */ NgxSelectboxMayComponent.prototype.isEnable; /** @type {?} */ NgxSelectboxMayComponent.prototype.propagateChange; /** @type {?} */ NgxSelectboxMayComponent.prototype.propagateOnTouch; /** @type {?} */ NgxSelectboxMayComponent.prototype._isLoading; /** @type {?} */ NgxSelectboxMayComponent.prototype._loadingText; /** @type {?} */ NgxSelectboxMayComponent.prototype.onKeyUp; /** @type {?} */ NgxSelectboxMayComponent.prototype.onSelect; /** @type {?} */ NgxSelectboxMayComponent.prototype.onBlur; /** @type {?} */ NgxSelectboxMayComponent.prototype.searchField; /** @type {?} */ NgxSelectboxMayComponent.prototype.listItems; /** @type {?} */ NgxSelectboxMayComponent.prototype.itemWindow; /** @type {?} */ NgxSelectboxMayComponent.prototype.actionTemplate; /** @type {?} */ NgxSelectboxMayComponent.prototype.ngModelValue; /** * @type {?} * @private */ NgxSelectboxMayComponent.prototype._selectboxref; /** * @type {?} * @private */ NgxSelectboxMayComponent.prototype.selectboxService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNlbGVjdGJveC1tYXkvIiwic291cmNlcyI6WyJsaWIvbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFnQixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7QUFrQm5GLE1BQU0sT0FBTyx3QkFBd0I7Ozs7O0lBeUVuQyxZQUFvQixhQUF5QixFQUFVLGdCQUF3QztRQUEzRSxrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUF2RS9GLGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUMxQyxZQUFPLEdBQXdCLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN6RCxpQkFBWSxHQUEyQixFQUFFLENBQUM7UUFDMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEIsb0JBQWUsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFnQixHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUF1RFgsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsYUFBUSxHQUFHLElBQUks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bEMsb0RBQW1DOztJQTJDbkMsOENBQW9COztJQU1wQixnREFBcUI7O0lBTXJCLDJDQUFxRDs7SUFDckQsNENBQXdEOztJQUN4RCwwQ0FBK0M7O0lBRS9DLCtDQUFtRDs7SUFDbkQsNkNBQTBEOztJQUMxRCw4Q0FBdUI7O0lBRXZCLGtEQUF3RTs7SUFxTXhFLGdEQUFrQjs7Ozs7SUFwTU4saURBQWlDOzs7OztJQUFFLG9EQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkLCBUZW1wbGF0ZVJlZiwgT25EZXN0cm95LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neFNlbGVjdGJveE1heVNlcnZpY2UgfSBmcm9tICcuL25neC1zZWxlY3Rib3gtbWF5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTkdYU2VsZWN0TWF5Q29uZmlncywgTkdYU2VsZWN0TWF5Um93IH0gZnJvbSAnLi9uZ3gtc2VsZWN0Ym94LW1heS1jb25maWdzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXNlbGVjdGJveC1tYXknLFxuICBob3N0OiB7XG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnb25DbGlja091dHNpZGUoJGV2ZW50KScsXG4gICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJ1xuICB9LFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtc2VsZWN0Ym94LW1heS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neFNlbGVjdGJveE1heUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4U2VsZWN0Ym94TWF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgZHJvcGRvd25Sb3dzOiBBcnJheTxOR1hTZWxlY3RNYXlSb3c+ID0gW107XG4gIGNvbmZpZ3M6IE5HWFNlbGVjdE1heUNvbmZpZ3MgPSBuZXcgTkdYU2VsZWN0TWF5Q29uZmlncygpO1xuICBzZWxlY3RlZFJvd3M6IEFycmF5PE5HWFNlbGVjdE1heVJvdz4gPSBbXTtcbiAgc2hvd19pdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiO1xuICBpc0VuYWJsZTpib29sZWFuID0gdHJ1ZTtcbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuICBwcm9wYWdhdGVPblRvdWNoID0gKF86IGFueSkgPT4geyB9O1xuXG4gIEBJbnB1dChcIml0ZW1zXCIpXG4gIHNldCBpdGVtcyhpdGVtczogYW55W10pIHtcbiAgICB0aGlzLmNyZWF0ZURyb3Bkb3duUm93cyhpdGVtcyk7XG4gIH1cblxuICBASW5wdXQoXCJjc3MtY2xhc3NcIilcbiAgc2V0IGNzc0NsYXNzKGNzc0NsYXNzOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MuY3NzQ2xhc3MgPSBjc3NDbGFzcztcbiAgfVxuXG4gIEBJbnB1dChcInZhbHVlLWZpZWxkXCIpXG4gIHNldCB2YWx1ZUZpZWxkKHZhbHVlRmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy52YWx1ZUZpZWxkID0gdmFsdWVGaWVsZDtcbiAgfVxuXG4gIEBJbnB1dChcImxhYmVsLWZpZWxkXCIpXG4gIHNldCBsYWJlbEZpZWxkKGxhYmVsRmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5sYWJlbEZpZWxkID0gbGFiZWxGaWVsZDtcbiAgICB0aGlzLnJlY29uZmlndXJlTGFiZWxzQW5kVmFsdWVzKCk7XG4gIH1cblxuICBASW5wdXQoXCJwbGFjZWhvbGRlclwiKVxuICBzZXQgcGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5wbGFjZWhvbGRlclRleHQgPSBwbGFjZWhvbGRlcjtcbiAgfVxuXG4gIEBJbnB1dChcImVtcHR5LXRleHRcIilcbiAgc2V0IGVtcHR5VGV4dChlbXB0eVRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5lbXB0eVRleHQgPSBlbXB0eVRleHQ7XG4gIH1cblxuICBASW5wdXQoXCJzaG93LWVtcHR5LXRleHRcIilcbiAgc2V0IHNob3dFbXB0eVJlc3VsdFRleHQoc2hvd0VtcHR5VGV4dDogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlncy5zaG93RW1wdHlSZXN1bHRzTGFiZWwgPSBzaG93RW1wdHlUZXh0O1xuICB9XG5cbiAgQElucHV0KFwiaXMtbXVsdGlcIilcbiAgc2V0IGlzTXVsdGkoaXNNdWx0aTogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0ID0gaXNNdWx0aTtcbiAgfVxuXG4gIF9pc0xvYWRpbmc6IGJvb2xlYW47XG4gIEBJbnB1dChcImlzLWxvYWRpbmdcIilcbiAgc2V0IGlzTG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0xvYWRpbmcgPSBpc0xvYWRpbmc7XG4gIH1cblxuICBfbG9hZGluZ1RleHQ6IHN0cmluZztcbiAgQElucHV0KFwibG9hZGluZy10ZXh0XCIpXG4gIHNldCBsb2FkaW5nVGV4dChsb2FkaW5nVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9hZGluZ1RleHQgPSBsb2FkaW5nVGV4dDtcbiAgfVxuXG4gIEBPdXRwdXQoXCJzZWFyY2gta2V5dXBcIikgb25LZXlVcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcIm9uLXNlbGVjdC1pdGVtXCIpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwib24tYmx1clwiKSBvbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoX2ZpZWxkJykgc2VhcmNoRmllbGQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oXCJsaV9pdGVtXCIpIGxpc3RJdGVtczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBpdGVtV2luZG93OiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoJ2FjdGlvblRlbXBsYXRlJykgYWN0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZWxlY3Rib3hyZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc2VsZWN0Ym94U2VydmljZTogTmd4U2VsZWN0Ym94TWF5U2VydmljZSkge1xuXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgfVxuXG5cbiAgY3JlYXRlRHJvcGRvd25Sb3dzKGl0ZW1zOiBhbnlbXSkge1xuICAgIHRoaXMuZHJvcGRvd25Sb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLmNyZWF0ZURyb3Bkb3duUm93cyhpdGVtcywgdGhpcy5jb25maWdzKTtcbiAgICB0aGlzLnNldFZhbHVlc1Bhc3NlZEV4dGVybmFsKHRoaXMubmdNb2RlbFZhbHVlKTtcbiAgfVxuXG4gIHJlY29uZmlndXJlTGFiZWxzQW5kVmFsdWVzKCkge1xuICAgIHRoaXMuc2VsZWN0Ym94U2VydmljZS5yZWNvbmZpZ3VyZURyb3Bkb3duUm93TGFiZWxzQW5kVmFsdWVzKHRoaXMuZHJvcGRvd25Sb3dzLCB0aGlzLmNvbmZpZ3MpO1xuICB9XG5cbiAgZ2V0U2VsZWN0Ym94TGFiZWwoKSB7XG4gICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLmNyZWF0ZURyb3Bkb3duTGFiZWwodGhpcy5jb25maWdzLCB0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgcmV0dXJuIGxhYmVsID8gbGFiZWwgOiB0aGlzLmNvbmZpZ3MucGxhY2Vob2xkZXJUZXh0O1xuICB9XG5cbiAgZ2V0RW1wdHlUZXh0TGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlncy5lbXB0eVRleHQgPyB0aGlzLmNvbmZpZ3MuZW1wdHlUZXh0IDogTkdYU2VsZWN0TWF5Q29uZmlncy5FTVBUWV9URVhUO1xuICB9XG5cbiAgZ2V0TG9hZGluZ1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdUZXh0ID8gdGhpcy5fbG9hZGluZ1RleHQgOiBOR1hTZWxlY3RNYXlDb25maWdzLkxPQURJTkdfVEVYVDtcbiAgfVxuXG4gIG9uQ2xpY2tTZWxlY3RCb3goKSB7XG4gICAgdGhpcy5zaG93SXRlbXNXaW5kb3coKTtcbiAgfVxuXG4gIGdldEFjdGl2ZUNsYXNzKCkge1xuICAgIHJldHVybiBOR1hTZWxlY3RNYXlDb25maWdzLlJPV19BQ1RJVkVfQ0xBU1M7XG4gIH1cblxuICBzaG93SXRlbXNXaW5kb3coKSB7XG4gICAgdGhpcy5zaG93X2l0ZW1zID0gdHJ1ZTtcbiAgfVxuXG4gIGhpZGVJdGVtc1dpbmRvdygpIHtcbiAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgdGhpcy5yZXNldEZpbHRlcnMoKTtcbiAgICB0aGlzLnNob3dfaXRlbXMgPSBmYWxzZTtcbiAgfVxuXG4gIG9uUmVtb3ZlQ2xpY2soKSB7XG4gICAgdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnVuc2VsZWN0QWxsU2VsZWN0ZWRSb3dzKHRoaXMuZHJvcGRvd25Sb3dzKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xuICAgIHRoaXMucHVibGlzaFZhbHVlKCk7XG4gIH1cblxuICBvblNlYXJjaEtleWRvd24oZSkge1xuICAgIGlmIChlLmtleSA9PSBcIkVzY2FwZVwiKSB7XG4gICAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIH1cbiAgICAvL1VwIGFuZCBEb3duIGFycm93IGV2ZW50c1xuICAgIGlmIChlLmtleUNvZGUgPT0gMzggfHwgZS5rZXlDb2RlID09IDQwKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hLZXl1cChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDAgfHwgZS5rZXkgPT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMub25LZXlVcC5lbWl0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IFwiXCI7XG4gIH1cblxuICBvbkNsaWNrSXRlbShyb3c6IE5HWFNlbGVjdE1heVJvdywgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbmZpZ3MuaXNNdWx0aVNlbGVjdCkge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnNldFNlbGVjdGVkSXRlbXModGhpcy5jb25maWdzLCB0aGlzLnNlbGVjdGVkUm93cywgdGhpcy5kcm9wZG93blJvd3MsIHJvdyk7XG4gICAgICB0aGlzLm9uU2VsZWN0LmVtaXQocm93LmRhdGEpO1xuICAgICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB9XG4gICAgdGhpcy5wdWJsaXNoVmFsdWUoKTtcbiAgfVxuXG4gIHB1Ymxpc2hWYWx1ZSgpIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5zZWxlY3RlZFJvd3MubWFwKHIgPT4gci52YWx1ZSk7XG4gICAgaWYgKHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6IFwiXCIpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZhbHVlc1Bhc3NlZEV4dGVybmFsKG9iajogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5zZWxlY3RJdGVtc0J5VmFsdWUodGhpcy5kcm9wZG93blJvd3MsIG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnNlbGVjdEl0ZW1CeVZhbHVlKHRoaXMuZHJvcGRvd25Sb3dzLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICpcbiAgKiBPbiBJdGVtIGJyb3dzZSBvcGVuIHdpbmRvdyBiZWdpbiAmIGRvY3VtZW50IG91dHNpZGUgY2xpY2sgZXZlbnQgQmVnaW5zXG4gICogXG4gICovXG5cbiAgQFZpZXdDaGlsZCgnaXRlbV93aW5kb3cnKSBzZXQgY29udGVudChjb250ZW50OiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5pdGVtV2luZG93ID0gY29udGVudDtcbiAgICAvLyB0aGlzLnBvc2l0aW9uV2luZG93KCk7XG4gICAgdGhpcy5mb2N1c1RvU2VhcmNoRmllbGQoKTtcbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk7XG4gIH1cblxuICBwb3NpdGlvbldpbmRvdygpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hGaWVsZCkge1xuICAgICAgY29uc3Qgc2VsZWN0Qm94UmVmID0gdGhpcy5fc2VsZWN0Ym94cmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPSBzZWxlY3RCb3hSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zb2xlLmxvZyh2aWV3cG9ydE9mZnNldCk7XG4gICAgICB0aGlzLml0ZW1XaW5kb3cubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAnICsgKHNlbGVjdEJveFJlZi5maXJzdENoaWxkLm9mZnNldFdpZHRoICsgMykgKyAncHg7IHRvcDogJyArICh2aWV3cG9ydE9mZnNldC50b3AgLSA1KSArICdweDsgbWFyZ2luLWxlZnQ6IC0xMnB4OycpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzVG9TZWFyY2hGaWVsZCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hGaWVsZCkge1xuICAgICAgdGhpcy5zZWFyY2hGaWVsZC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKSB7XG4gICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaChsaSA9PiB7XG4gICAgICBpZiAobGkubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoTkdYU2VsZWN0TWF5Q29uZmlncy5ST1dfQUNUSVZFX0NMQVNTKSkge1xuICAgICAgICBjb25zdCBzY3JvbGxMaSA9IGxpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXRlbVdpbmRvdy5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidWxcIilbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsTGkub2Zmc2V0VG9wIC0gKHNjcm9sbExpLm9mZnNldEhlaWdodCArIDIwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2xpY2tPdXRzaWRlKGUpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGJveHJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgdGhpcy5zaG93X2l0ZW1zKSB7XG4gICAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIH1cbiAgfVxuXG4gIG9uV2luZG93UmVzaXplKGUpIHtcbiAgICAvLyB0aGlzLnBvc2l0aW9uV2luZG93KCk7XG4gIH1cblxuICBzZXREaXNhYmxlKCl7XG4gICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB0aGlzLmlzRW5hYmxlID0gZmFsc2U7XG4gIH1cblxuICBzZXRFbmFibGUoKXtcbiAgICB0aGlzLmlzRW5hYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qXG4gICpcbiAgKiBPbiBJdGVtIGJyb3dzZSBvcGVuIHdpbmRvdyBiZWdpbiAmIGRvY3VtZW50IG91dHNpZGUgY2xpY2sgZXZlbnQgRW5kc1xuICAqIFxuICAqL1xuXG5cblxuICAvKlxuICAvL29uIGRvY3VtZW50IGtleSB1cCBhbmQgZG93blxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYoKGV2ZW50LmtleUNvZGUgPT0gMzggfHwgZXZlbnQua2V5Q29kZSA9PSA0MCkgJiYgdGhpcy5pdGVtV2luZG93ICYmIHRoaXMuY2xvbmVkSXRlbXMubGVuZ3RoID4gMCl7XG4gICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgdWwgPSB0aGlzLml0ZW1XaW5kb3cubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInVsXCIpWzBdXG4gICAgICAgIHZhciBzZWxlY3RlZExpID0gdWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2VsZWN0ZWQnKVswXTtcbiAgICAgICAgaWYoc2VsZWN0ZWRMaSl7XG4gICAgICAgICAgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHVsLmNoaWxkcmVuLCBzZWxlY3RlZExpKTtcbiAgICAgICAgICBzZWxlY3RlZExpLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvL3VwIGFycm93XG4gICAgICAgIGlmKGV2ZW50LmtleUNvZGUgPT0gMzgpe1xuICAgICAgICAgIGluZGV4ID0gKChpbmRleCAtIDEpIDwgMCkgPyAwIDogKGluZGV4IC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9kb3duIGFycm93XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgaW5kZXggPSAoKGluZGV4ICsgMSkgPiAodWwuY2hpbGRyZW4ubGVuZ3RoIC0xKSkgPyAodWwuY2hpbGRyZW4ubGVuZ3RoIC0xKSA6ICAoaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB1bC5jaGlsZHJlbltpbmRleF0uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgICB1bC5zY3JvbGxUb3AgPSB1bC5jaGlsZHJlbltpbmRleF0ub2Zmc2V0VG9wIC0gKHVsLmNoaWxkcmVuW2luZGV4XS5vZmZzZXRIZWlnaHQgKyAyMCk7XG4gICAgfVxuICB9XG4qL1xuICAvL0NvbnRyb2wgdmFsdWUgYWNjZXNzb3IgYmVnaW5zXG4gIC8vU3RvcmUgZXh0ZXJuYWwgdmFsdWUgb25jZSBpdGVtcyBnb3QgbG9hZGVkIGluIHRvIGRyb3Bkb3duXG4gIG5nTW9kZWxWYWx1ZTogYW55O1xuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgdGhpcy5uZ01vZGVsVmFsdWUgPSBvYmo7XG4gICAgdGhpcy5zZXRWYWx1ZXNQYXNzZWRFeHRlcm5hbChvYmopO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlT25Ub3VjaCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhpc0Rpc2FibGVkLCBcInNldCBkaXNhYmxlXCIpO1xuICAgIGlmKGlzRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zZXREaXNhYmxlKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnNldEVuYWJsZSgpO1xuICAgIH1cbiAgfVxuICAvL0NvbnRyb2wgdmFsdWUgYWNjZXNzb3IgZW5kc1xufSJdfQ==