UNPKG

@ng-flexy/form-bootstrap

Version:

Flexy components and tools to build Angular 8+ applications

200 lines 20.8 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl } from '@angular/forms'; import { findRawValue, prepareControlValue } from '@ng-flexy/form'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@ng-select/ng-select"; import * as i3 from "@angular/forms"; import * as i4 from "./readonly.component"; function FlexyControlSelect2Component_ng_select_0_ng_template_2_span_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span", 9); } if (rf & 2) { const item_r5 = i0.ɵɵnextContext().item; i0.ɵɵproperty("innerHTML", item_r5["prefixHtml"], i0.ɵɵsanitizeHtml); } } function FlexyControlSelect2Component_ng_select_0_ng_template_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_ng_template_2_span_0_Template, 1, 1, "span", 6); i0.ɵɵelementStart(1, "span", 7); i0.ɵɵtext(2); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "span", 8); i0.ɵɵlistener("click", function FlexyControlSelect2Component_ng_select_0_ng_template_2_Template_span_click_3_listener() { const item_r5 = ctx.item; const clear_r6 = ctx.clear; return clear_r6(item_r5); }); i0.ɵɵtext(4, "\u00D7"); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r5 = ctx.item; i0.ɵɵproperty("ngIf", item_r5["prefixHtml"]); i0.ɵɵadvance(1); i0.ɵɵpropertyInterpolate("title", item_r5.text); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r5.text); } } function FlexyControlSelect2Component_ng_select_0_ng_template_3_span_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span", 9); } if (rf & 2) { const item_r10 = i0.ɵɵnextContext().item; i0.ɵɵproperty("innerHTML", item_r10["prefixHtml"], i0.ɵɵsanitizeHtml); } } function FlexyControlSelect2Component_ng_select_0_ng_template_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_ng_template_3_span_0_Template, 1, 1, "span", 6); i0.ɵɵelementStart(1, "span", 7); i0.ɵɵtext(2); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r10 = ctx.item; i0.ɵɵproperty("ngIf", item_r10["prefixHtml"]); i0.ɵɵadvance(1); i0.ɵɵpropertyInterpolate("title", item_r10.text); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r10.text); } } const _c0 = function (a0) { return { "ng-select-multiple": a0 }; }; function FlexyControlSelect2Component_ng_select_0_Template(rf, ctx) { if (rf & 1) { const _r15 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "ng-select", 2, 3); i0.ɵɵlistener("change", function FlexyControlSelect2Component_ng_select_0_Template_ng_select_change_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return ctx_r14.onChange($event); }); i0.ɵɵtemplate(2, FlexyControlSelect2Component_ng_select_0_ng_template_2_Template, 5, 3, "ng-template", 4); i0.ɵɵtemplate(3, FlexyControlSelect2Component_ng_select_0_ng_template_3_Template, 3, 3, "ng-template", 5); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c0, ctx_r0.multiple))("formControl", ctx_r0.selectControl)("items", ctx_r0.optionsData)("placeholder", ctx_r0.placeholder)("multiple", ctx_r0.multiple)("addTag", ctx_r0.addItem)("hideSelected", ctx_r0.hideSelected)("searchFn", ctx_r0.enableSearchByValue ? ctx_r0.customSearchFn : null)("virtualScroll", ctx_r0.virtualScroll)("loading", ctx_r0.loading)("loadingText", ctx_r0.loadingText); } } function FlexyControlSelect2Component_flexy_control_readonly_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "flexy-control-readonly", 10); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("value", ctx_r1.getReadonlyInfo(ctx_r1.control == null ? null : ctx_r1.control.value))("default", ctx_r1.default); } } export class FlexyControlSelect2Component { constructor() { this.loading = false; // no You can set the loading state from the outside (e.g. async items loading) this.loadingText = 'Loading...'; // Loading... no Set custom text when for loading items this.focused = new EventEmitter(); this.clicked = new EventEmitter(); this.changed = new EventEmitter(); this.virtualScroll = false; // Enable virtual scroll for better performance when rendering a lot of data } ngOnInit() { this.selectControl = new FormControl(findRawValue(this.optionsRawId, this.control.value, this.options)); } ngOnChanges(changes) { if (changes.options) { const optionsData = []; if (this.options) { optionsData.push(...this.options.map(item => { let itemData; if (typeof item === 'object' && item.hasOwnProperty('value')) { itemData = item; } else { itemData = { value: item, text: '' + item }; } return itemData; })); } this.virtualScroll = optionsData.length > 100; this.optionsData = optionsData; } } onChange(data) { const value = prepareControlValue(this.optionsRawId, data); this.control.setValue(value); this.changed.emit(value); } getReadonlyInfo(value) { if (value && this.addItem) { return value; } if ((value || value === 0) && this.optionsData) { const opt = this.optionsData.find((item) => '' + item.value === '' + value); return opt ? opt.text : ''; } else if (value === null || value === '' || value === void 0) { return null; } } customSearchFn(term, item) { return ((item.text && item.text.toLowerCase().includes(term.toLowerCase())) || (item.value && item.value.toLowerCase().includes(term.toLowerCase()))); } } FlexyControlSelect2Component.ɵfac = function FlexyControlSelect2Component_Factory(t) { return new (t || FlexyControlSelect2Component)(); }; FlexyControlSelect2Component.ɵcmp = i0.ɵɵdefineComponent({ type: FlexyControlSelect2Component, selectors: [["flexy-control-select2"]], inputs: { control: "control", options: "options", optionsRawId: "optionsRawId", default: "default", readonly: "readonly", multiple: "multiple", addItem: "addItem", placeholder: "placeholder", hideSelected: "hideSelected", enableSearchByValue: "enableSearchByValue", loading: "loading", loadingText: "loadingText" }, outputs: { focused: "focused", clicked: "clicked", changed: "changed" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 2, consts: [["bindLabel", "text", "bindValue", "value", 3, "ngClass", "formControl", "items", "placeholder", "multiple", "addTag", "hideSelected", "searchFn", "virtualScroll", "loading", "loadingText", "change", 4, "ngIf"], [3, "value", "default", 4, "ngIf"], ["bindLabel", "text", "bindValue", "value", 3, "ngClass", "formControl", "items", "placeholder", "multiple", "addTag", "hideSelected", "searchFn", "virtualScroll", "loading", "loadingText", "change"], ["select", ""], ["ng-label-tmp", ""], ["ng-option-tmp", ""], [3, "innerHTML", 4, "ngIf"], [3, "title"], [1, "ng-value-icon", "right", "t2e-unselect-value", 3, "click"], [3, "innerHTML"], [3, "value", "default"]], template: function FlexyControlSelect2Component_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, FlexyControlSelect2Component_ng_select_0_Template, 4, 13, "ng-select", 0); i0.ɵɵtemplate(1, FlexyControlSelect2Component_flexy_control_readonly_1_Template, 1, 2, "flexy-control-readonly", 1); } if (rf & 2) { i0.ɵɵproperty("ngIf", !ctx.readonly && ctx.optionsData); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.readonly); } }, directives: [i1.NgIf, i2.NgSelectComponent, i1.NgClass, i3.NgControlStatus, i3.FormControlDirective, i2.ɵh, i2.ɵf, i4.FlexyControlReadonlyComponent], encapsulation: 2, changeDetection: 0 }); /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(FlexyControlSelect2Component, [{ type: Component, args: [{ template: ` <ng-select *ngIf="!readonly && optionsData" #select [ngClass]="{ 'ng-select-multiple': multiple }" [formControl]="selectControl" [items]="optionsData" [placeholder]="placeholder" bindLabel="text" bindValue="value" [multiple]="multiple" [addTag]="addItem" [hideSelected]="hideSelected" [searchFn]="enableSearchByValue ? customSearchFn : null" [virtualScroll]="virtualScroll" [loading]="loading" [loadingText]="loadingText" (change)="onChange($event)" > <ng-template ng-label-tmp let-item="item" let-clear="clear"> <span *ngIf="item['prefixHtml']" [innerHTML]="item['prefixHtml']"></span> <span title="{{ item.text }}">{{ item.text }}</span> <span class="ng-value-icon right t2e-unselect-value" (click)="clear(item)">×</span> </ng-template> <ng-template ng-option-tmp let-item="item" let-index="index"> <span *ngIf="item['prefixHtml']" [innerHTML]="item['prefixHtml']"></span> <span title="{{ item.text }}">{{ item.text }}</span> </ng-template> </ng-select> <flexy-control-readonly *ngIf="readonly" [value]="getReadonlyInfo(control?.value)" [default]="default"> </flexy-control-readonly> `, selector: 'flexy-control-select2', changeDetection: ChangeDetectionStrategy.OnPush }] }], null, { control: [{ type: Input }], options: [{ type: Input }], optionsRawId: [{ type: Input }], default: [{ type: Input }], readonly: [{ type: Input }], multiple: [{ type: Input }], addItem: [{ type: Input }], placeholder: [{ type: Input }], hideSelected: [{ type: Input }], enableSearchByValue: [{ type: Input }], loading: [{ type: Input }], loadingText: [{ type: Input }], focused: [{ type: Output }], clicked: [{ type: Output }], changed: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLWJvb3RzdHJhcC9zcmMvbGliL2NvbnRyb2xzL3NlbGVjdDIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFrQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0lBdUIzRiwwQkFBeUU7OztJQUF4QyxvRUFBZ0M7OztJQUFqRSx5R0FBa0U7SUFBUSwrQkFBOEI7SUFBQSxZQUFlO0lBQUEsaUJBQU87SUFDOUgsK0JBQTJFO0lBQXRCLDRNQUFxQjtJQUFDLHNCQUFDO0lBQUEsaUJBQU87OztJQUQ3RSw0Q0FBMEI7SUFBZ0QsZUFBdUI7SUFBdkIsK0NBQXVCO0lBQUMsZUFBZTtJQUFmLGtDQUFlOzs7SUFJdkgsMEJBQXlFOzs7SUFBeEMscUVBQWdDOzs7SUFBakUseUdBQWtFO0lBQVEsK0JBQThCO0lBQUEsWUFBZTtJQUFBLGlCQUFPOzs7SUFBeEgsNkNBQTBCO0lBQWdELGVBQXVCO0lBQXZCLGdEQUF1QjtJQUFDLGVBQWU7SUFBZixtQ0FBZTs7Ozs7SUF2QjNILHVDQWtCRTtJQUZBLHdOQUEyQjtJQUUzQix5R0FDRTtJQUdGLHlHQUNFO0lBRUosaUJBQVk7OztJQXRCVixzRUFBOEMscUNBQUEsNkJBQUEsbUNBQUEsNkJBQUEsMEJBQUEscUNBQUEsdUVBQUEsdUNBQUEsMkJBQUEsbUNBQUE7OztJQXVCaEQsNkNBQWlJOzs7SUFBeEYsb0dBQXlDLDJCQUFBOztBQUt0RixNQUFNLE9BQU8sNEJBQTRCO0lBakN6QztRQTZDVyxZ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SUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUN0RSxDQUFDO0lBQ0osQ0FBQzs7d0dBM0VVLDRCQUE0QjtpRUFBNUIsNEJBQTRCO1FBL0JyQywwRkFrQkU7UUFRRixtSEFBd0c7O1FBekJ0Ryx1REFBZ0M7UUF5QlYsZUFBZ0I7UUFBaEIsbUNBQWdCOztrREFLL0IsNEJBQTRCO2NBakN4QyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJUO2dCQUNELFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO2dCQUVVLE9BQU87a0JBQWYsS0FBSztZQUNHLE9BQU87a0JBQWYsS0FBSztZQUNHLFlBQVk7a0JBQXBCLEtBQUs7WUFDRyxPQUFPO2tCQUFmLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLE9BQU87a0JBQWYsS0FBSztZQUNHLFdBQVc7a0JBQW5CLEtBQUs7WUFDRyxZQUFZO2tCQUFwQixLQUFLO1lBQ0csbUJBQW1CO2tCQUEzQixLQUFLO1lBRUcsT0FBTztrQkFBZixLQUFLO1lBQ0csV0FBVztrQkFBbkIsS0FBSztZQUVJLE9BQU87a0JBQWhCLE1BQU07WUFDRyxPQUFPO2tCQUFoQixNQUFNO1lBQ0csT0FBTztrQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmluZFJhd1ZhbHVlLCBwcmVwYXJlQ29udHJvbFZhbHVlLCBTZWxlY3RPcHRpb24sIFNlbGVjdE9wdGlvbkRhdGEgfSBmcm9tICdAbmctZmxleHkvZm9ybSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1zZWxlY3RcbiAgICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIG9wdGlvbnNEYXRhXCJcbiAgICAgICNzZWxlY3RcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ25nLXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlIH1cIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInNlbGVjdENvbnRyb2xcIlxuICAgICAgW2l0ZW1zXT1cIm9wdGlvbnNEYXRhXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBiaW5kTGFiZWw9XCJ0ZXh0XCJcbiAgICAgIGJpbmRWYWx1ZT1cInZhbHVlXCJcbiAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICBbYWRkVGFnXT1cImFkZEl0ZW1cIlxuICAgICAgW2hpZGVTZWxlY3RlZF09XCJoaWRlU2VsZWN0ZWRcIlxuICAgICAgW3NlYXJjaEZuXT1cImVuYWJsZVNlYXJjaEJ5VmFsdWUgPyBjdXN0b21TZWFyY2hGbiA6IG51bGxcIlxuICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwidmlydHVhbFNjcm9sbFwiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZy1sYWJlbC10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWNsZWFyPVwiY2xlYXJcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtWydwcmVmaXhIdG1sJ11cIiBbaW5uZXJIVE1MXT1cIml0ZW1bJ3ByZWZpeEh0bWwnXVwiPjwvc3Bhbj4gPHNwYW4gdGl0bGU9XCJ7eyBpdGVtLnRleHQgfX1cIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtaWNvbiByaWdodCB0MmUtdW5zZWxlY3QtdmFsdWVcIiAoY2xpY2spPVwiY2xlYXIoaXRlbSlcIj7Dlzwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW1bJ3ByZWZpeEh0bWwnXVwiIFtpbm5lckhUTUxdPVwiaXRlbVsncHJlZml4SHRtbCddXCI+PC9zcGFuPiA8c3BhbiB0aXRsZT1cInt7IGl0ZW0udGV4dCB9fVwiPnt7IGl0ZW0udGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1zZWxlY3Q+XG4gICAgPGZsZXh5LWNvbnRyb2wtcmVhZG9ubHkgKm5nSWY9XCJyZWFkb25seVwiIFt2YWx1ZV09XCJnZXRSZWFkb25seUluZm8oY29udHJvbD8udmFsdWUpXCIgW2RlZmF1bHRdPVwiZGVmYXVsdFwiPiA8L2ZsZXh5LWNvbnRyb2wtcmVhZG9ubHk+XG4gIGAsXG4gIHNlbGVjdG9yOiAnZmxleHktY29udHJvbC1zZWxlY3QyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRmxleHlDb250cm9sU2VsZWN0MkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29udHJvbDogRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdO1xuICBASW5wdXQoKSBvcHRpb25zUmF3SWQ6IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdDogc3RyaW5nO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFkZEl0ZW06IGJvb2xlYW47XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGhpZGVTZWxlY3RlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoQnlWYWx1ZTogYm9vbGVhbjtcblxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7IC8vIG5vXHRZb3UgY2FuIHNldCB0aGUgbG9hZGluZyBzdGF0ZSBmcm9tIHRoZSBvdXRzaWRlIChlLmcuIGFzeW5jIGl0ZW1zIGxvYWRpbmcpXG4gIEBJbnB1dCgpIGxvYWRpbmdUZXh0ID0gJ0xvYWRpbmcuLi4nOyAvLyBMb2FkaW5nLi4uXHRub1x0U2V0IGN1c3RvbSB0ZXh0IHdoZW4gZm9yIGxvYWRpbmcgaXRlbXNcblxuICBAT3V0cHV0KCkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBzZWxlY3RDb250cm9sOiBGb3JtQ29udHJvbDtcblxuICB2aXJ0dWFsU2Nyb2xsID0gZmFsc2U7IC8vIEVuYWJsZSB2aXJ0dWFsIHNjcm9sbCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcmVuZGVyaW5nIGEgbG90IG9mIGRhdGFcbiAgb3B0aW9uc0RhdGE6IFNlbGVjdE9wdGlvbkRhdGFbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woZmluZFJhd1ZhbHVlKHRoaXMub3B0aW9uc1Jhd0lkLCB0aGlzLmNvbnRyb2wudmFsdWUsIHRoaXMub3B0aW9ucykpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnNEYXRhID0gW107XG4gICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnNEYXRhLnB1c2goXG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtRGF0YTogU2VsZWN0T3B0aW9uRGF0YTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgICAgICAgICBpdGVtRGF0YSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyArIGl0ZW1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtRGF0YTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gb3B0aW9uc0RhdGEubGVuZ3RoID4gMTAwO1xuICAgICAgdGhpcy5vcHRpb25zRGF0YSA9IG9wdGlvbnNEYXRhO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKGRhdGE6IFNlbGVjdE9wdGlvbkRhdGEgfCBTZWxlY3RPcHRpb25EYXRhW10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByZXBhcmVDb250cm9sVmFsdWUodGhpcy5vcHRpb25zUmF3SWQsIGRhdGEpO1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VkLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0UmVhZG9ubHlJbmZvKHZhbHVlKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5hZGRJdGVtKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICgodmFsdWUgfHwgdmFsdWUgPT09IDApICYmIHRoaXMub3B0aW9uc0RhdGEpIHtcbiAgICAgIGNvbnN0IG9wdDogU2VsZWN0T3B0aW9uID0gdGhpcy5vcHRpb25zRGF0YS5maW5kKChpdGVtOiBTZWxlY3RPcHRpb24pID0+ICcnICsgaXRlbS52YWx1ZSA9PT0gJycgKyB2YWx1ZSk7XG4gICAgICByZXR1cm4gb3B0ID8gb3B0LnRleHQgOiAnJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjdXN0b21TZWFyY2hGbih0ZXJtOiBzdHJpbmcsIGl0ZW06IFNlbGVjdE9wdGlvbikge1xuICAgIHJldHVybiAoXG4gICAgICAoaXRlbS50ZXh0ICYmIGl0ZW0udGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0udG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAoaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICApO1xuICB9XG59XG4iXX0=