UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

128 lines 18.4 kB
import { Directive, inject, Input } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes'; import { TuiActiveZone } from '@taiga-ui/cdk/directives/active-zone'; import { TuiNativeValidator } from '@taiga-ui/cdk/directives/native-validator'; import { TUI_IS_MOBILE, tuiFallbackValueProvider } from '@taiga-ui/cdk/tokens'; import { tuiGetClipboardDataText, tuiInjectElement } from '@taiga-ui/cdk/utils/dom'; import { tuiAsTextfieldAccessor, TuiTextfieldBase, TuiTextfieldMultiComponent, } from '@taiga-ui/core/components/textfield'; import { TuiDropdownDirective, tuiDropdownOpen } from '@taiga-ui/core/directives/dropdown'; import { TUI_ITEMS_HANDLERS } from '@taiga-ui/core/directives/items-handlers'; import { filter } from 'rxjs'; import { TUI_INPUT_CHIP_OPTIONS } from './input-chip.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/cdk/directives/native-validator"; import * as i2 from "@taiga-ui/core/components/textfield"; class TuiInputChipDirective extends TuiControl { constructor() { super(...arguments); this.handlers = inject(TUI_ITEMS_HANDLERS); this.options = inject(TUI_INPUT_CHIP_OPTIONS); this.mobile = inject(TUI_IS_MOBILE); this.textfield = inject(TuiTextfieldMultiComponent); this.open = tuiDropdownOpen(); this.dropdown = inject(TuiDropdownDirective); this.sub = inject(TuiActiveZone) .tuiActiveZoneChange.pipe(filter((active) => !active), takeUntilDestroyed()) .subscribe(() => { this.onEnter(); this.textfield.value.set(''); }); this.separator = this.options.separator; this.unique = this.options.unique; this.el = tuiInjectElement(); } setValue(value) { this.textfield.value.set(''); this.onChange(this.unique ? Array.from(new Set(value.reverse())).reverse() : value); } onEnter() { const value = this.textfield.value().trim(); const items = this.separator ? value.split(this.separator) : [value]; const valid = items.filter((item) => item && !this.handlers.disabledItemHandler()(item)); if (!value || !valid.length) { return; } this.setValue([...this.value(), ...valid]); this.scrollTo(); } onInput() { this.open.set(!!this.dropdown.content); if (this.separator && this.textfield.value().match(this.separator)) { this.onEnter(); } else { this.scrollTo(); } } onPaste(event) { const value = 'dataTransfer' in event ? event.dataTransfer?.getData('text/plain') || '' : tuiGetClipboardDataText(event); this.textfield.value.set(value); this.onEnter(); } onBackspace(key) { // (keydown.backspace) doesn't emit event on empty input in ios safari if (key === 'Backspace' && !this.textfield.value() && this.interactive() && (this.mobile || !this.textfield.item)) { this.onChange(this.value().slice(0, -1)); } } scrollTo() { let sign = 1; try { sign = this.textfield.el.matches(':dir(rtl)') ? -1 : 1; } catch { } // Allow change detection to run and add new tag to DOM setTimeout(() => { this.textfield.el.scrollTo({ left: sign * Number.MAX_SAFE_INTEGER, top: Number.MAX_SAFE_INTEGER, }); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputChipDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputChipDirective, isStandalone: true, selector: "input[tuiInputChip]", inputs: { separator: "separator", unique: "unique" }, host: { attributes: { "enterkeyhint": "enter" }, listeners: { "keydown.enter.prevent": "onEnter()", "keydown.zoneless": "onBackspace($event.key)", "input": "onInput()", "paste.prevent": "onPaste($event)", "drop.prevent": "onPaste($event)" }, properties: { "disabled": "disabled()" } }, providers: [ tuiAsControl(TuiInputChipDirective), tuiFallbackValueProvider([]), tuiAsTextfieldAccessor(TuiInputChipDirective), ], usesInheritance: true, hostDirectives: [{ directive: i1.TuiNativeValidator }, { directive: i2.TuiTextfieldBase, inputs: ["invalid", "invalid", "focused", "focused", "readOnly", "readOnly", "state", "state"] }], ngImport: i0 }); } } export { TuiInputChipDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputChipDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: 'input[tuiInputChip]', providers: [ tuiAsControl(TuiInputChipDirective), tuiFallbackValueProvider([]), tuiAsTextfieldAccessor(TuiInputChipDirective), ], hostDirectives: [ TuiNativeValidator, { directive: TuiTextfieldBase, inputs: ['invalid', 'focused', 'readOnly', 'state'], }, ], host: { enterkeyhint: 'enter', '[disabled]': 'disabled()', '(keydown.enter.prevent)': 'onEnter()', '(keydown.zoneless)': 'onBackspace($event.key)', '(input)': 'onInput()', '(paste.prevent)': 'onPaste($event)', '(drop.prevent)': 'onPaste($event)', }, }] }], propDecorators: { separator: [{ type: Input }], unique: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY2hpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9pbnB1dC1jaGlwL2lucHV0LWNoaXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUMsYUFBYSxFQUFFLHdCQUF3QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFbEYsT0FBTyxFQUNILHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsMEJBQTBCLEdBQzdCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXpGLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFNUIsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFNUQsTUF5QmEscUJBQ1QsU0FBUSxVQUFlO0lBMUIzQjs7UUE2QnFCLGFBQVEsR0FBd0IsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsWUFBTyxHQUFHLE1BQU0sQ0FBQyxz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QUF3QixDQUFDLEVBQUUsQ0FBQztZQUM1QixzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQztTQUNoRDs7U0FrQlEscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBekJqQyxTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUscUJBQXFCO29CQUMvQixTQUFTLEVBQUU7d0JBQ1AsWUFBWSx1QkFBdUI7d0JBQ25DLHdCQUF3QixDQUFDLEVBQUUsQ0FBQzt3QkFDNUIsc0JBQXNCLHVCQUF1QjtxQkFDaEQ7b0JBQ0QsY0FBYyxFQUFFO3dCQUNaLGtCQUFrQjt3QkFDbEI7NEJBQ0ksU0FBUyxFQUFFLGdCQUFnQjs0QkFDM0IsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO3lCQUN0RDtxQkFDSjtvQkFDRCxJQUFJLEVBQUU7d0JBQ0YsWUFBWSxFQUFFLE9BQU87d0JBQ3JCLFlBQVksRUFBRSxZQUFZO3dCQUMxQix5QkFBeUIsRUFBRSxXQUFXO3dCQUN0QyxvQkFBb0IsRUFBRSx5QkFBeUI7d0JBQy9DLFNBQVMsRUFBRSxXQUFXO3dCQUN0QixpQkFBaUIsRUFBRSxpQkFBaUI7d0JBQ3BDLGdCQUFnQixFQUFFLGlCQUFpQjtxQkFDdEM7aUJBQ0o7OEJBdUJVLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgaW5qZWN0LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHt0dWlBc0NvbnRyb2wsIFR1aUNvbnRyb2x9IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1R1aUFjdGl2ZVpvbmV9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9hY3RpdmUtem9uZSc7XG5pbXBvcnQge1R1aU5hdGl2ZVZhbGlkYXRvcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9kaXJlY3RpdmVzL25hdGl2ZS12YWxpZGF0b3InO1xuaW1wb3J0IHtUVUlfSVNfTU9CSUxFLCB0dWlGYWxsYmFja1ZhbHVlUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpR2V0Q2xpcGJvYXJkRGF0YVRleHQsIHR1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB0eXBlIHtUdWlUZXh0ZmllbGRBY2Nlc3Nvcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHtcbiAgICB0dWlBc1RleHRmaWVsZEFjY2Vzc29yLFxuICAgIFR1aVRleHRmaWVsZEJhc2UsXG4gICAgVHVpVGV4dGZpZWxkTXVsdGlDb21wb25lbnQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7VHVpRHJvcGRvd25EaXJlY3RpdmUsIHR1aURyb3Bkb3duT3Blbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9kcm9wZG93bic7XG5pbXBvcnQgdHlwZSB7VHVpSXRlbXNIYW5kbGVyc30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9pdGVtcy1oYW5kbGVycyc7XG5pbXBvcnQge1RVSV9JVEVNU19IQU5ETEVSU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9pdGVtcy1oYW5kbGVycyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7VFVJX0lOUFVUX0NISVBfT1BUSU9OU30gZnJvbSAnLi9pbnB1dC1jaGlwLm9wdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXRDaGlwXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzQ29udHJvbChUdWlJbnB1dENoaXBEaXJlY3RpdmUpLFxuICAgICAgICB0dWlGYWxsYmFja1ZhbHVlUHJvdmlkZXIoW10pLFxuICAgICAgICB0dWlBc1RleHRmaWVsZEFjY2Vzc29yKFR1aUlucHV0Q2hpcERpcmVjdGl2ZSksXG4gICAgXSxcbiAgICBob3N0RGlyZWN0aXZlczogW1xuICAgICAgICBUdWlOYXRpdmVWYWxpZGF0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogVHVpVGV4dGZpZWxkQmFzZSxcbiAgICAgICAgICAgIGlucHV0czogWydpbnZhbGlkJywgJ2ZvY3VzZWQnLCAncmVhZE9ubHknLCAnc3RhdGUnXSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgZW50ZXJrZXloaW50OiAnZW50ZXInLFxuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgJyhrZXlkb3duLmVudGVyLnByZXZlbnQpJzogJ29uRW50ZXIoKScsXG4gICAgICAgICcoa2V5ZG93bi56b25lbGVzcyknOiAnb25CYWNrc3BhY2UoJGV2ZW50LmtleSknLFxuICAgICAgICAnKGlucHV0KSc6ICdvbklucHV0KCknLFxuICAgICAgICAnKHBhc3RlLnByZXZlbnQpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoZHJvcC5wcmV2ZW50KSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0Q2hpcERpcmVjdGl2ZTxUPlxuICAgIGV4dGVuZHMgVHVpQ29udHJvbDxUW10+XG4gICAgaW1wbGVtZW50cyBUdWlUZXh0ZmllbGRBY2Nlc3NvcjxUW10+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfSU5QVVRfQ0hJUF9PUFRJT05TKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vYmlsZSA9IGluamVjdChUVUlfSVNfTU9CSUxFKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRmaWVsZCA9IGluamVjdChUdWlUZXh0ZmllbGRNdWx0aUNvbXBvbmVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gdHVpRHJvcGRvd25PcGVuKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93biA9IGluamVjdChUdWlEcm9wZG93bkRpcmVjdGl2ZSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3ViID0gaW5qZWN0KFR1aUFjdGl2ZVpvbmUpXG4gICAgICAgIC50dWlBY3RpdmVab25lQ2hhbmdlLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGFjdGl2ZSkgPT4gIWFjdGl2ZSksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FbnRlcigpO1xuICAgICAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KCcnKTtcbiAgICAgICAgfSk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXBhcmF0b3IgPSB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5pcXVlID0gdGhpcy5vcHRpb25zLnVuaXF1ZTtcblxuICAgIHB1YmxpYyByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQ8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICAgIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogVFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCgnJyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoXG4gICAgICAgICAgICB0aGlzLnVuaXF1ZSA/IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZS5yZXZlcnNlKCkpKS5yZXZlcnNlKCkgOiB2YWx1ZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25FbnRlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRmaWVsZC52YWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgaXRlbXM6IGFueVtdID0gdGhpcy5zZXBhcmF0b3IgPyB2YWx1ZS5zcGxpdCh0aGlzLnNlcGFyYXRvcikgOiBbdmFsdWVdO1xuICAgICAgICBjb25zdCB2YWxpZCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICYmICF0aGlzLmhhbmRsZXJzLmRpc2FibGVkSXRlbUhhbmRsZXIoKShpdGVtKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VmFsdWUoWy4uLnRoaXMudmFsdWUoKSwgLi4udmFsaWRdKTtcbiAgICAgICAgdGhpcy5zY3JvbGxUbygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbklucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW4uc2V0KCEhdGhpcy5kcm9wZG93bi5jb250ZW50KTtcblxuICAgICAgICBpZiAodGhpcy5zZXBhcmF0b3IgJiYgdGhpcy50ZXh0ZmllbGQudmFsdWUoKS5tYXRjaCh0aGlzLnNlcGFyYXRvcikpIHtcbiAgICAgICAgICAgIHRoaXMub25FbnRlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgICdkYXRhVHJhbnNmZXInIGluIGV2ZW50XG4gICAgICAgICAgICAgICAgPyBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoJ3RleHQvcGxhaW4nKSB8fCAnJ1xuICAgICAgICAgICAgICAgIDogdHVpR2V0Q2xpcGJvYXJkRGF0YVRleHQoZXZlbnQpO1xuXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25FbnRlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkJhY2tzcGFjZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyAoa2V5ZG93bi5iYWNrc3BhY2UpIGRvZXNuJ3QgZW1pdCBldmVudCBvbiBlbXB0eSBpbnB1dCBpbiBpb3Mgc2FmYXJpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGtleSA9PT0gJ0JhY2tzcGFjZScgJiZcbiAgICAgICAgICAgICF0aGlzLnRleHRmaWVsZC52YWx1ZSgpICYmXG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aXZlKCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1vYmlsZSB8fCAhdGhpcy50ZXh0ZmllbGQuaXRlbSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUoKS5zbGljZSgwLCAtMSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvKCk6IHZvaWQge1xuICAgICAgICBsZXQgc2lnbiA9IDE7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNpZ24gPSB0aGlzLnRleHRmaWVsZC5lbC5tYXRjaGVzKCc6ZGlyKHJ0bCknKSA/IC0xIDogMTtcbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIC8vIEFsbG93IGNoYW5nZSBkZXRlY3Rpb24gdG8gcnVuIGFuZCBhZGQgbmV3IHRhZyB0byBET01cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRleHRmaWVsZC5lbC5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgbGVmdDogc2lnbiAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgICAgIHRvcDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19