UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

156 lines 17.4 kB
import { Component, ChangeDetectorRef, Input, Output, EventEmitter, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "../input/input.component"; import * as i2 from "../button/button.component"; import * as i3 from "@angular/common"; const GTX_SEARCH_BAR_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SearchBar), multi: true }; /** * The SearchBar component should be the primary search input for the app. It should be * located near the top of the screen, below the [TopBar](#/top-bar). * * ```html * <gtx-search-bar [query]="searchQuery" * (change)="onChange($event)" * (search)="search($event)"> * </gtx-search-bar> * ``` * * ## Use With NgModel * The search query can be bound with `NgModel`, which can be useful for implementing a reset function: * * ```html * <gtx-search-bar [(ngModel)]="searchQuery" * (clear)="searchQuery = ''"> * </gtx-search-bar> * ``` * * ## Content Projection * Content inside the `<gtx-search-bar>` tags will be projected inside the component, to the left of the * search bar. This can be used, for example, to display current filters being applied to the search. * * ```html * <gtx-search-bar> * <div class="chip">Tag 1<i class="material-icons">close</i></div> * </gtx-search-bar> * ``` * * ## Custom Icons * Icons in the `<gtx-search-bar>` can be replaced with custom ones. * * ```html * <gtx-search-bar submitIcon="filter_list" * clearIcon="undo"> * </gtx-search-bar> * ``` */ export class SearchBar { constructor(changeDetector) { this.changeDetector = changeDetector; /** * Sets the input field to be auto-focused. Handled by `AutofocusDirective`. */ this.autofocus = false; /** * Value that pre-fills the search input with a string value. */ this.query = ''; /** * Sets the icon displayed for the submit button */ this.submitIcon = 'search'; /** * Sets the icon displayed for the clear button */ this.clearIcon = 'close'; /** * Placeholder text which is shown when no text is entered. */ this.placeholder = 'Search'; /** * Fired when either the search button is clicked, or * the "enter" key is pressed while the input has focus. */ this.search = new EventEmitter(); /** * Fired whenever the value of the input changes. */ this.change = new EventEmitter(); /** * Fired when the clear button is clicked. */ this.clear = new EventEmitter(); this._hideClearButton = false; // ValueAccessor members this.onChange = (_) => { }; this.onTouched = () => { }; } /** * Setting this attribute will prevent the "clear" button from being displayed * when the query is non-empty. */ get hideClearButton() { return this._hideClearButton === true; } set hideClearButton(val) { this._hideClearButton = val != null && val !== false; } doSearch() { this.search.emit(this.query); } /** * Handler for pressing "enter" key. */ onKeyDown(event) { if (event.keyCode === 13) { this.doSearch(); } } onInputChange(event) { this.query = event; if (typeof event === 'string') { this.onChange(event); this.change.emit(event); } } onInputBlur(event) { if (typeof event === 'string') { this.onTouched(event); } } writeValue(value) { this.query = value; this.changeDetector.markForCheck(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } } /** @nocollapse */ SearchBar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: SearchBar, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ SearchBar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: SearchBar, selector: "gtx-search-bar", inputs: { autofocus: "autofocus", query: "query", submitIcon: "submitIcon", clearIcon: "clearIcon", placeholder: "placeholder", hideClearButton: "hideClearButton" }, outputs: { search: "search", change: "change", clear: "clear" }, providers: [GTX_SEARCH_BAR_VALUE_ACCESSOR], ngImport: i0, template: "<div class=\"contents\">\n <ng-content></ng-content>\n</div>\n<div class=\"input\">\n <gtx-input [placeholder]=\"placeholder\"\n [value]=\"query\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onInputBlur($event)\"\n (change)=\"onInputChange($event)\"></gtx-input>\n</div>\n<div class=\"clear-button\" *ngIf=\"!hideClearButton && query && query !== ''\">\n <gtx-button icon type=\"secondary\" (click)=\"clear.emit(true)\">\n <i class=\"material-icons\">{{ clearIcon }}</i>\n </gtx-button>\n</div>\n<div class=\"submit-button\">\n <gtx-button flat (click)=\"doSearch()\">\n <i class=\"material-icons\">{{ submitIcon }}</i>\n </gtx-button>\n</div>\n", components: [{ type: i1.InputField, selector: "gtx-input", inputs: ["autocomplete", "autofocus", "disabled", "id", "label", "max", "min", "maxlength", "name", "pattern", "placeholder", "readonly", "required", "step", "type", "value"], outputs: ["blur", "focus", "change"] }, { type: i2.Button, selector: "gtx-button", inputs: ["autofocus", "size", "type", "flat", "icon", "disabled", "submit"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: SearchBar, decorators: [{ type: Component, args: [{ selector: 'gtx-search-bar', providers: [GTX_SEARCH_BAR_VALUE_ACCESSOR], template: "<div class=\"contents\">\n <ng-content></ng-content>\n</div>\n<div class=\"input\">\n <gtx-input [placeholder]=\"placeholder\"\n [value]=\"query\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onInputBlur($event)\"\n (change)=\"onInputChange($event)\"></gtx-input>\n</div>\n<div class=\"clear-button\" *ngIf=\"!hideClearButton && query && query !== ''\">\n <gtx-button icon type=\"secondary\" (click)=\"clear.emit(true)\">\n <i class=\"material-icons\">{{ clearIcon }}</i>\n </gtx-button>\n</div>\n<div class=\"submit-button\">\n <gtx-button flat (click)=\"doSearch()\">\n <i class=\"material-icons\">{{ submitIcon }}</i>\n </gtx-button>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { autofocus: [{ type: Input }], query: [{ type: Input }], submitIcon: [{ type: Input }], clearIcon: [{ type: Input }], placeholder: [{ type: Input }], hideClearButton: [{ type: Input }], search: [{ type: Output }], change: [{ type: Output }], clear: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zZWFyY2gtYmFyL3NlYXJjaC1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoLWJhci9zZWFyY2gtYmFyLnRwbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFdkUsTUFBTSw2QkFBNkIsR0FBRztJQUNsQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3hDLEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQU1ILE1BQU0sT0FBTyxTQUFTO0lBNERsQixZQUFvQixjQUFpQztRQUFqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUEzRHJEOztXQUVHO1FBQ00sY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUNNLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFNUI7O1dBRUc7UUFDTSxlQUFVLEdBQVcsUUFBUSxDQUFDO1FBRXZDOztXQUVHO1FBQ00sY0FBUyxHQUFXLE9BQU8sQ0FBQztRQUVyQzs7V0FFRztRQUNNLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBY2hDOzs7V0FHRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTlDOztXQUVHO1FBQ08sV0FBTSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUM7O1dBRUc7UUFDTyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV0QyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFMUMsd0JBQXdCO1FBQ3hCLGFBQVEsR0FBUSxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQy9CLGNBQVMsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFK0IsQ0FBQztJQWxDMUQ7OztPQUdHO0lBQ0gsSUFDSSxlQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLGVBQWUsQ0FBQyxHQUFZO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUM7SUFDekQsQ0FBQztJQTBCRCxRQUFRO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFvQjtRQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuQjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3JCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBWSxJQUFVLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RCxpQkFBaUIsQ0FBQyxFQUFZLElBQVUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOzt5SEEvRnJELFNBQVM7NkdBQVQsU0FBUyxnUkFGUCxDQUFDLDZCQUE2QixDQUFDLDBCQ25EOUMsZ3VCQW9CQTsyRkRpQ2EsU0FBUztrQkFMckIsU0FBUzsrQkFDSSxnQkFBZ0IsYUFFZixDQUFDLDZCQUE2QixDQUFDO3dHQU1qQyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFPRixlQUFlO3NCQURsQixLQUFLO2dCQVlJLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBS0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIENoYW5nZURldGVjdG9yUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuY29uc3QgR1RYX1NFQVJDSF9CQVJfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VhcmNoQmFyKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBUaGUgU2VhcmNoQmFyIGNvbXBvbmVudCBzaG91bGQgYmUgdGhlIHByaW1hcnkgc2VhcmNoIGlucHV0IGZvciB0aGUgYXBwLiBJdCBzaG91bGQgYmVcbiAqIGxvY2F0ZWQgbmVhciB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIGJlbG93IHRoZSBbVG9wQmFyXSgjL3RvcC1iYXIpLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxndHgtc2VhcmNoLWJhciBbcXVlcnldPVwic2VhcmNoUXVlcnlcIlxuICogICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gKiAgICAgICAgICAgICAgICAgKHNlYXJjaCk9XCJzZWFyY2goJGV2ZW50KVwiPlxuICogPC9ndHgtc2VhcmNoLWJhcj5cbiAqIGBgYFxuICpcbiAqICMjIFVzZSBXaXRoIE5nTW9kZWxcbiAqIFRoZSBzZWFyY2ggcXVlcnkgY2FuIGJlIGJvdW5kIHdpdGggYE5nTW9kZWxgLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgYSByZXNldCBmdW5jdGlvbjpcbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LXNlYXJjaC1iYXIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiXG4gKiAgICAgICAgICAgICAgICAgKGNsZWFyKT1cInNlYXJjaFF1ZXJ5ID0gJydcIj5cbiAqIDwvZ3R4LXNlYXJjaC1iYXI+XG4gKiBgYGBcbiAqXG4gKiAjIyBDb250ZW50IFByb2plY3Rpb25cbiAqIENvbnRlbnQgaW5zaWRlIHRoZSBgPGd0eC1zZWFyY2gtYmFyPmAgdGFncyB3aWxsIGJlIHByb2plY3RlZCBpbnNpZGUgdGhlIGNvbXBvbmVudCwgdG8gdGhlIGxlZnQgb2YgdGhlXG4gKiBzZWFyY2ggYmFyLiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gZGlzcGxheSBjdXJyZW50IGZpbHRlcnMgYmVpbmcgYXBwbGllZCB0byB0aGUgc2VhcmNoLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxndHgtc2VhcmNoLWJhcj5cbiAqICAgICAgPGRpdiBjbGFzcz1cImNoaXBcIj5UYWcgMTxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5jbG9zZTwvaT48L2Rpdj5cbiAqIDwvZ3R4LXNlYXJjaC1iYXI+XG4gKiBgYGBcbiAqXG4gKiAjIyBDdXN0b20gSWNvbnNcbiAqIEljb25zIGluIHRoZSBgPGd0eC1zZWFyY2gtYmFyPmAgY2FuIGJlIHJlcGxhY2VkIHdpdGggY3VzdG9tIG9uZXMuXG4gKlxuICogYGBgaHRtbFxuICogPGd0eC1zZWFyY2gtYmFyIHN1Ym1pdEljb249XCJmaWx0ZXJfbGlzdFwiXG4gKiAgICAgICAgICAgICAgICAgY2xlYXJJY29uPVwidW5kb1wiPlxuICogPC9ndHgtc2VhcmNoLWJhcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2d0eC1zZWFyY2gtYmFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWJhci50cGwuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbR1RYX1NFQVJDSF9CQVJfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaEJhciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbnB1dCBmaWVsZCB0byBiZSBhdXRvLWZvY3VzZWQuIEhhbmRsZWQgYnkgYEF1dG9mb2N1c0RpcmVjdGl2ZWAuXG4gICAgICovXG4gICAgQElucHV0KCkgYXV0b2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSB0aGF0IHByZS1maWxscyB0aGUgc2VhcmNoIGlucHV0IHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gICAgICovXG4gICAgQElucHV0KCkgcXVlcnk6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaWNvbiBkaXNwbGF5ZWQgZm9yIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICovXG4gICAgQElucHV0KCkgc3VibWl0SWNvbjogc3RyaW5nID0gJ3NlYXJjaCc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpY29uIGRpc3BsYXllZCBmb3IgdGhlIGNsZWFyIGJ1dHRvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNsZWFySWNvbjogc3RyaW5nID0gJ2Nsb3NlJztcblxuICAgIC8qKlxuICAgICAqIFBsYWNlaG9sZGVyIHRleHQgd2hpY2ggaXMgc2hvd24gd2hlbiBubyB0ZXh0IGlzIGVudGVyZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VhcmNoJztcblxuICAgIC8qKlxuICAgICAqIFNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgd2lsbCBwcmV2ZW50IHRoZSBcImNsZWFyXCIgYnV0dG9uIGZyb20gYmVpbmcgZGlzcGxheWVkXG4gICAgICogd2hlbiB0aGUgcXVlcnkgaXMgbm9uLWVtcHR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGhpZGVDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVDbGVhckJ1dHRvbiA9PT0gdHJ1ZTtcbiAgICB9XG4gICAgc2V0IGhpZGVDbGVhckJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faGlkZUNsZWFyQnV0dG9uID0gdmFsICE9IG51bGwgJiYgdmFsICE9PSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGVpdGhlciB0aGUgc2VhcmNoIGJ1dHRvbiBpcyBjbGlja2VkLCBvclxuICAgICAqIHRoZSBcImVudGVyXCIga2V5IGlzIHByZXNzZWQgd2hpbGUgdGhlIGlucHV0IGhhcyBmb2N1cy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGNoYW5nZXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgcHJpdmF0ZSBfaGlkZUNsZWFyQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBWYWx1ZUFjY2Vzc29yIG1lbWJlcnNcbiAgICBvbkNoYW5nZTogYW55ID0gKF86IGFueSkgPT4ge307XG4gICAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIGRvU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHRoaXMucXVlcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIHByZXNzaW5nIFwiZW50ZXJcIiBrZXkuXG4gICAgICovXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgdGhpcy5kb1NlYXJjaCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZShldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVlcnkgPSBldmVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0Qmx1cihldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGVudHNcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbnB1dFwiPlxuICAgIDxndHgtaW5wdXQgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgIFt2YWx1ZV09XCJxdWVyeVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCI+PC9ndHgtaW5wdXQ+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJjbGVhci1idXR0b25cIiAqbmdJZj1cIiFoaWRlQ2xlYXJCdXR0b24gJiYgcXVlcnkgJiYgcXVlcnkgIT09ICcnXCI+XG4gICAgPGd0eC1idXR0b24gaWNvbiB0eXBlPVwic2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNsZWFyLmVtaXQodHJ1ZSlcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPnt7IGNsZWFySWNvbiB9fTwvaT5cbiAgICA8L2d0eC1idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCI+XG4gICAgPGd0eC1idXR0b24gZmxhdCAoY2xpY2spPVwiZG9TZWFyY2goKVwiPlxuICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+e3sgc3VibWl0SWNvbiB9fTwvaT5cbiAgICA8L2d0eC1idXR0b24+XG48L2Rpdj5cbiJdfQ==