@taiga-ui/kit
Version:
Taiga UI Angular main components kit
166 lines • 26.7 kB
JavaScript
import { computed, Directive, effect, inject, Input, signal } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { MaskitoDirective } from '@maskito/angular';
import { maskitoDateOptionsGenerator } from '@maskito/kit';
import { tuiAsControl, TuiControl, tuiValueTransformerFrom } from '@taiga-ui/cdk/classes';
import { TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants';
import { DATE_FILLER_LENGTH, TuiDay } from '@taiga-ui/cdk/date-time';
import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { TuiCalendar } from '@taiga-ui/core/components/calendar';
import { tuiAsOptionContent } from '@taiga-ui/core/components/data-list';
import { tuiInjectAuxiliary, TuiTextfieldDirective, tuiTextfieldIconBinding, TuiWithNativePicker, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
import { TuiDropdownAuto, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown';
import { TUI_ITEMS_HANDLERS, TuiItemsHandlersDirective, TuiItemsHandlersValidator, } from '@taiga-ui/core/directives/items-handlers';
import { TUI_DATE_FORMAT, TUI_DEFAULT_DATE_FORMAT } from '@taiga-ui/core/tokens';
import { TuiCalendarRange } from '@taiga-ui/kit/components/calendar-range';
import { TuiSelectOption } from '@taiga-ui/kit/components/select';
import { tuiMaskito } from '@taiga-ui/kit/utils';
import { tuiWithDateFiller } from './date-filler';
import { TUI_INPUT_DATE_OPTIONS_NEW } from './input-date.options';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
import * as i2 from "@taiga-ui/core/directives/dropdown";
import * as i3 from "@taiga-ui/core/directives/items-handlers";
import * as i4 from "@maskito/angular";
export const TUI_DATE_ADAPTER = {
DMY: 'dd/mm/yyyy',
MDY: 'mm/dd/yyyy',
YMD: 'yyyy/mm/dd',
};
class TuiInputDateBase extends TuiControl {
constructor() {
super(...arguments);
this.calendar = tuiInjectAuxiliary((x) => x instanceof TuiCalendar || x instanceof TuiCalendarRange);
this.el = tuiInjectElement();
this.textfield = inject(TuiTextfieldDirective);
this.filler = tuiWithDateFiller();
this.mobile = inject(TUI_IS_MOBILE);
this.open = tuiDropdownOpen();
this.icon = tuiTextfieldIconBinding(TUI_INPUT_DATE_OPTIONS_NEW);
this.handlers = inject(TuiItemsHandlersDirective);
this.dropdownEnabled = tuiDropdownEnabled(computed(() => !this.native && this.interactive()));
this.options = inject(TUI_INPUT_DATE_OPTIONS_NEW);
this.format = toSignal(inject(TUI_DATE_FORMAT), {
initialValue: TUI_DEFAULT_DATE_FORMAT,
});
this.valueEffect = effect(() => {
const value = this.stringify(this.value()) ||
(this.filler().length === this.el.value.length ? '' : this.el.value);
this.textfield.value.set(value);
}, TUI_ALLOW_SIGNAL_WRITES);
this.calendarIn = effect(() => {
if (this.calendar()) {
this.processCalendar(this.calendar());
}
}, TUI_ALLOW_SIGNAL_WRITES);
this.calendarOut = effect((onCleanup) => {
const subscription = this.calendar()?.valueChange.subscribe((value) => this.setDate(value));
onCleanup(() => subscription?.unsubscribe());
});
this.native = !!inject(TuiWithNativePicker, { optional: true }) && this.mobile;
this.min = signal(this.options.min);
this.max = signal(this.options.max);
}
set minSetter(min) {
this.min.set(min instanceof TuiDay ? min : this.options.min);
}
set maxSetter(max) {
this.max.set(max instanceof TuiDay ? max : this.options.max);
}
writeValue(value) {
const reset = this.control.pristine && this.control.untouched && !value;
if (value !== this.value() || reset) {
super.writeValue(value);
this.textfield.value.set(this.stringify(this.value()));
}
}
setDate(value) {
this.onChange(value);
this.open.set(false);
if (!this.el.closest('tui-dropdown')) {
this.el.blur();
}
}
processCalendar(calendar) {
const value = this.value();
calendar.value = Array.isArray(value) ? value[0] : value;
calendar.disabledItemHandler =
this.handlers.disabledItemHandler();
calendar.min = this.min();
calendar.max = this.max();
}
onClick() {
if (!this.mobile && this.dropdownEnabled()) {
this.open.update((open) => !open);
}
}
stringify(value) {
return value?.toString(this.format().mode, this.format().separator) ?? '';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateBase, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputDateBase, isStandalone: true, inputs: { minSetter: ["min", "minSetter"], maxSetter: ["max", "maxSetter"] }, host: { listeners: { "input": "onValueChange($event.target.value)", "click.capture.stop": "onClick()" }, properties: { "attr.inputmode": "mobile && open() ? \"none\" : \"numeric\"", "disabled": "disabled()" } }, usesInheritance: true, ngImport: i0 }); }
}
export { TuiInputDateBase };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateBase, decorators: [{
type: Directive,
args: [{
standalone: true,
host: {
'[attr.inputmode]': 'mobile && open() ? "none" : "numeric"',
'[disabled]': 'disabled()',
'(input)': 'onValueChange($event.target.value)',
'(click.capture.stop)': 'onClick()',
},
}]
}], propDecorators: { minSetter: [{
type: Input,
args: ['min']
}], maxSetter: [{
type: Input,
args: ['max']
}] } });
class TuiInputDateDirective extends TuiInputDateBase {
constructor() {
super(...arguments);
this.identity = inject(TUI_ITEMS_HANDLERS).identityMatcher.set((a, b) => a.daySame(b));
this.mask = tuiMaskito(computed(() => maskitoDateOptionsGenerator({
separator: this.format().separator,
mode: TUI_DATE_ADAPTER[this.format().mode],
min: this.min().toLocalNativeDate(),
max: this.max().toLocalNativeDate(),
})));
}
onValueChange(value) {
this.control?.control?.updateValueAndValidity({ emitEvent: false });
this.onChange(value.length === DATE_FILLER_LENGTH
? TuiDay.normalizeParse(value, this.format().mode)
: null);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputDateDirective, isStandalone: true, selector: "input[tuiInputDate]", providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsControl(TuiInputDateDirective),
tuiValueTransformerFrom(TUI_INPUT_DATE_OPTIONS_NEW),
], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }, { directive: i2.TuiDropdownAuto }, { directive: i3.TuiItemsHandlersValidator }, { directive: i4.MaskitoDirective }], ngImport: i0 }); }
}
export { TuiInputDateDirective };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputDateDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'input[tuiInputDate]',
providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsControl(TuiInputDateDirective),
tuiValueTransformerFrom(TUI_INPUT_DATE_OPTIONS_NEW),
],
hostDirectives: [
TuiWithTextfield,
TuiDropdownAuto,
TuiItemsHandlersValidator,
MaskitoDirective,
],
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZGF0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9pbnB1dC1kYXRlL2lucHV0LWRhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDL0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0gsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixlQUFlLEdBQ2xCLE1BQU0sb0NBQW9DLENBQUM7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QU8sRUFBRSxPQUFPLEVBQUUsc0JBQXNCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsUUFBUSxDQUNULEtBQUssQ0FBQyxNQUFNLEtBQUssa0JBQWtCO1lBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxJQUFJLENBQ2IsQ0FBQztJQUNOLENBQUM7K0dBdkJRLHFCQUFxQjttR0FBckIscUJBQXFCLGtFQVpuQjtZQUNQLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUNuQyxZQUFZLENBQUMscUJBQXFCLENBQUM7WUFDbkMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUM7U0FDdEQ7O1NBUVEscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBZmpDLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFNBQVMsRUFBRTt3QkFDUCxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7d0JBQ25DLFlBQVksdUJBQXVCO3dCQUNuQyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQztxQkFDdEQ7b0JBQ0QsY0FBYyxFQUFFO3dCQUNaLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZix5QkFBeUI7d0JBQ3pCLGdCQUFnQjtxQkFDbkI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NvbXB1dGVkLCBEaXJlY3RpdmUsIGVmZmVjdCwgaW5qZWN0LCBJbnB1dCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7TWFza2l0b0RpcmVjdGl2ZX0gZnJvbSAnQG1hc2tpdG8vYW5ndWxhcic7XG5pbXBvcnQgdHlwZSB7TWFza2l0b0RhdGVNb2RlfSBmcm9tICdAbWFza2l0by9raXQnO1xuaW1wb3J0IHttYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3J9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQge3R1aUFzQ29udHJvbCwgVHVpQ29udHJvbCwgdHVpVmFsdWVUcmFuc2Zvcm1lckZyb219IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1RVSV9BTExPV19TSUdOQUxfV1JJVEVTfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7VHVpRGF0ZU1vZGUsIFR1aURheVJhbmdlLCBUdWlUaW1lfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge0RBVEVfRklMTEVSX0xFTkdUSCwgVHVpRGF5fSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge1RVSV9JU19NT0JJTEV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB0eXBlIHtUdWlCb29sZWFuSGFuZGxlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7VHVpQ2FsZW5kYXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXInO1xuaW1wb3J0IHt0dWlBc09wdGlvbkNvbnRlbnR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7XG4gICAgdHVpSW5qZWN0QXV4aWxpYXJ5LFxuICAgIFR1aVRleHRmaWVsZERpcmVjdGl2ZSxcbiAgICB0dWlUZXh0ZmllbGRJY29uQmluZGluZyxcbiAgICBUdWlXaXRoTmF0aXZlUGlja2VyLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVHVpRHJvcGRvd25BdXRvLFxuICAgIHR1aURyb3Bkb3duRW5hYmxlZCxcbiAgICB0dWlEcm9wZG93bk9wZW4sXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvZHJvcGRvd24nO1xuaW1wb3J0IHR5cGUge1R1aUl0ZW1zSGFuZGxlcnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHtcbiAgICBUVUlfSVRFTVNfSEFORExFUlMsXG4gICAgVHVpSXRlbXNIYW5kbGVyc0RpcmVjdGl2ZSxcbiAgICBUdWlJdGVtc0hhbmRsZXJzVmFsaWRhdG9yLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7VFVJX0RBVEVfRk9STUFULCBUVUlfREVGQVVMVF9EQVRFX0ZPUk1BVH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VHVpQ2FsZW5kYXJSYW5nZX0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2NhbGVuZGFyLXJhbmdlJztcbmltcG9ydCB7VHVpU2VsZWN0T3B0aW9ufSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvc2VsZWN0JztcbmltcG9ydCB7dHVpTWFza2l0b30gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscyc7XG5cbmltcG9ydCB7dHVpV2l0aERhdGVGaWxsZXJ9IGZyb20gJy4vZGF0ZS1maWxsZXInO1xuaW1wb3J0IHR5cGUge1R1aUlucHV0RGF0ZU9wdGlvbnNOZXd9IGZyb20gJy4vaW5wdXQtZGF0ZS5vcHRpb25zJztcbmltcG9ydCB7VFVJX0lOUFVUX0RBVEVfT1BUSU9OU19ORVd9IGZyb20gJy4vaW5wdXQtZGF0ZS5vcHRpb25zJztcblxuZXhwb3J0IGNvbnN0IFRVSV9EQVRFX0FEQVBURVI6IFJlY29yZDxUdWlEYXRlTW9kZSwgTWFza2l0b0RhdGVNb2RlPiA9IHtcbiAgICBETVk6ICdkZC9tbS95eXl5JyxcbiAgICBNRFk6ICdtbS9kZC95eXl5JyxcbiAgICBZTUQ6ICd5eXl5L21tL2RkJyxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaW5wdXRtb2RlXSc6ICdtb2JpbGUgJiYgb3BlbigpID8gXCJub25lXCIgOiBcIm51bWVyaWNcIicsXG4gICAgICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkKCknLFxuICAgICAgICAnKGlucHV0KSc6ICdvblZhbHVlQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAgICAgJyhjbGljay5jYXB0dXJlLnN0b3ApJzogJ29uQ2xpY2soKScsXG4gICAgfSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHVpSW5wdXREYXRlQmFzZTxcbiAgICBUIGV4dGVuZHMgVHVpRGF5IHwgVHVpRGF5UmFuZ2UgfCByZWFkb25seSBbVHVpRGF5LCBUdWlUaW1lIHwgbnVsbF0sXG4+IGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgbnVsbD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXIgPSB0dWlJbmplY3RBdXhpbGlhcnk8VHVpQ2FsZW5kYXIgfCBUdWlDYWxlbmRhclJhbmdlPihcbiAgICAgICAgKHgpID0+IHggaW5zdGFuY2VvZiBUdWlDYWxlbmRhciB8fCB4IGluc3RhbmNlb2YgVHVpQ2FsZW5kYXJSYW5nZSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudDxIVE1MSW5wdXRFbGVtZW50PigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0ZXh0ZmllbGQgPSBpbmplY3QoVHVpVGV4dGZpZWxkRGlyZWN0aXZlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsbGVyID0gdHVpV2l0aERhdGVGaWxsZXIoKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9iaWxlID0gaW5qZWN0KFRVSV9JU19NT0JJTEUpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcGVuID0gdHVpRHJvcGRvd25PcGVuKCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb24gPSB0dWlUZXh0ZmllbGRJY29uQmluZGluZyhUVUlfSU5QVVRfREFURV9PUFRJT05TX05FVyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXJzID0gaW5qZWN0PFR1aUl0ZW1zSGFuZGxlcnM8VD4+KFR1aUl0ZW1zSGFuZGxlcnNEaXJlY3RpdmUpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyb3Bkb3duRW5hYmxlZCA9IHR1aURyb3Bkb3duRW5hYmxlZChcbiAgICAgICAgY29tcHV0ZWQoKCkgPT4gIXRoaXMubmF0aXZlICYmIHRoaXMuaW50ZXJhY3RpdmUoKSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBPbWl0PFR1aUlucHV0RGF0ZU9wdGlvbnNOZXcsICd2YWx1ZVRyYW5zZm9ybWVyJz4gPSBpbmplY3QoXG4gICAgICAgIFRVSV9JTlBVVF9EQVRFX09QVElPTlNfTkVXLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9ybWF0ID0gdG9TaWduYWwoaW5qZWN0KFRVSV9EQVRFX0ZPUk1BVCksIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBUVUlfREVGQVVMVF9EQVRFX0ZPUk1BVCxcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgIHRoaXMuc3RyaW5naWZ5KHRoaXMudmFsdWUoKSkgfHxcbiAgICAgICAgICAgICh0aGlzLmZpbGxlcigpLmxlbmd0aCA9PT0gdGhpcy5lbC52YWx1ZS5sZW5ndGggPyAnJyA6IHRoaXMuZWwudmFsdWUpO1xuXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCh2YWx1ZSk7XG4gICAgfSwgVFVJX0FMTE9XX1NJR05BTF9XUklURVMpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFySW4gPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhcigpKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDYWxlbmRhcih0aGlzLmNhbGVuZGFyKCkhKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhck91dCA9IGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuY2FsZW5kYXIoKT8udmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh2YWx1ZSksXG4gICAgICAgICk7XG5cbiAgICAgICAgb25DbGVhbnVwKCgpID0+IHN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgbmF0aXZlID1cbiAgICAgICAgISFpbmplY3QoVHVpV2l0aE5hdGl2ZVBpY2tlciwge29wdGlvbmFsOiB0cnVlfSkgJiYgdGhpcy5tb2JpbGU7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluID0gc2lnbmFsKHRoaXMub3B0aW9ucy5taW4pO1xuICAgIHB1YmxpYyByZWFkb25seSBtYXggPSBzaWduYWwodGhpcy5vcHRpb25zLm1heCk7XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25WYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAgIEBJbnB1dCgnbWluJylcbiAgICBwdWJsaWMgc2V0IG1pblNldHRlcihtaW46IEV4Y2x1ZGU8VCwgVHVpRGF5UmFuZ2U+IHwgVHVpRGF5IHwgbnVsbCkge1xuICAgICAgICB0aGlzLm1pbi5zZXQobWluIGluc3RhbmNlb2YgVHVpRGF5ID8gbWluIDogdGhpcy5vcHRpb25zLm1pbik7XG4gICAgfVxuXG4gICAgQElucHV0KCdtYXgnKVxuICAgIHB1YmxpYyBzZXQgbWF4U2V0dGVyKG1heDogRXhjbHVkZTxULCBUdWlEYXlSYW5nZT4gfCBUdWlEYXkgfCBudWxsKSB7XG4gICAgICAgIHRoaXMubWF4LnNldChtYXggaW5zdGFuY2VvZiBUdWlEYXkgPyBtYXggOiB0aGlzLm9wdGlvbnMubWF4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLmNvbnRyb2wucHJpc3RpbmUgJiYgdGhpcy5jb250cm9sLnVudG91Y2hlZCAmJiAhdmFsdWU7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKCkgfHwgcmVzZXQpIHtcbiAgICAgICAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KHRoaXMuc3RyaW5naWZ5KHRoaXMudmFsdWUoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldERhdGUodmFsdWU6IFR1aURheSB8IFR1aURheVJhbmdlKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUgYXMgVCk7XG4gICAgICAgIHRoaXMub3Blbi5zZXQoZmFsc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5lbC5jbG9zZXN0KCd0dWktZHJvcGRvd24nKSkge1xuICAgICAgICAgICAgdGhpcy5lbC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NhbGVuZGFyKGNhbGVuZGFyOiBUdWlDYWxlbmRhciB8IFR1aUNhbGVuZGFyUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICAgICAgY2FsZW5kYXIudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgICAgIGNhbGVuZGFyLmRpc2FibGVkSXRlbUhhbmRsZXIgPVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5kaXNhYmxlZEl0ZW1IYW5kbGVyKCkgYXMgVHVpQm9vbGVhbkhhbmRsZXI8XG4gICAgICAgICAgICAgICAgVHVpRGF5IHwgVHVpRGF5UmFuZ2VcbiAgICAgICAgICAgID47XG4gICAgICAgIGNhbGVuZGFyLm1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNhbGVuZGFyLm1heCA9IHRoaXMubWF4KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUgJiYgdGhpcy5kcm9wZG93bkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuLnVwZGF0ZSgob3BlbikgPT4gIW9wZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0cmluZ2lmeSh2YWx1ZTogVCB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWU/LnRvU3RyaW5nKHRoaXMuZm9ybWF0KCkubW9kZSwgdGhpcy5mb3JtYXQoKS5zZXBhcmF0b3IpID8/ICcnO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ2lucHV0W3R1aUlucHV0RGF0ZV0nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB0dWlBc09wdGlvbkNvbnRlbnQoVHVpU2VsZWN0T3B0aW9uKSxcbiAgICAgICAgdHVpQXNDb250cm9sKFR1aUlucHV0RGF0ZURpcmVjdGl2ZSksXG4gICAgICAgIHR1aVZhbHVlVHJhbnNmb3JtZXJGcm9tKFRVSV9JTlBVVF9EQVRFX09QVElPTlNfTkVXKSxcbiAgICBdLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgICAgIFR1aVdpdGhUZXh0ZmllbGQsXG4gICAgICAgIFR1aURyb3Bkb3duQXV0byxcbiAgICAgICAgVHVpSXRlbXNIYW5kbGVyc1ZhbGlkYXRvcixcbiAgICAgICAgTWFza2l0b0RpcmVjdGl2ZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlJbnB1dERhdGVEaXJlY3RpdmUgZXh0ZW5kcyBUdWlJbnB1dERhdGVCYXNlPFR1aURheT4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpZGVudGl0eSA9IGluamVjdDxUdWlJdGVtc0hhbmRsZXJzPFR1aURheT4+KFxuICAgICAgICBUVUlfSVRFTVNfSEFORExFUlMsXG4gICAgKS5pZGVudGl0eU1hdGNoZXIuc2V0KChhLCBiKSA9PiBhLmRheVNhbWUoYikpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hc2sgPSB0dWlNYXNraXRvKFxuICAgICAgICBjb21wdXRlZCgoKSA9PlxuICAgICAgICAgICAgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3I6IHRoaXMuZm9ybWF0KCkuc2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgIG1vZGU6IFRVSV9EQVRFX0FEQVBURVJbdGhpcy5mb3JtYXQoKS5tb2RlXSxcbiAgICAgICAgICAgICAgICBtaW46IHRoaXMubWluKCkudG9Mb2NhbE5hdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4KCkudG9Mb2NhbE5hdGl2ZURhdGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25WYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbD8uY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKFxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID09PSBEQVRFX0ZJTExFUl9MRU5HVEhcbiAgICAgICAgICAgICAgICA/IFR1aURheS5ub3JtYWxpemVQYXJzZSh2YWx1ZSwgdGhpcy5mb3JtYXQoKS5tb2RlKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=