UNPKG

ngx-colors

Version:

A beautiful color picker for angular that let you choose from a color palette, using sliders (Hue, Lightness, Alpha sliders) or through text input(hex, rgba, hsla)

158 lines 19 kB
import { EventEmitter, Input, Output, Directive, HostListener, forwardRef, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { formats } from '../helpers/formats'; import { ColorFormats } from '../enums/formats'; import * as i0 from "@angular/core"; import * as i1 from "../services/panel-factory.service"; import * as i2 from "../services/converter.service"; export class NgxColorsTriggerDirective { onClick() { this.openPanel(); } constructor(triggerRef, panelFactory, service) { this.triggerRef = triggerRef; this.panelFactory = panelFactory; this.service = service; //Main input/output of the color picker // @Input() color = '#000000'; // @Output() colorChange:EventEmitter<string> = new EventEmitter<string>(); this.color = ''; //This defines the type of animation for the palatte.(slide-in | popup) this.colorsAnimation = 'slide-in'; this.position = 'bottom'; this.attachTo = undefined; this.overlayClassName = undefined; this.colorPickerControls = 'default'; this.acceptLabel = 'ACCEPT'; this.cancelLabel = 'CANCEL'; // This event is trigger every time the selected color change this.change = new EventEmitter(); // This event is trigger every time the user change the color using the panel this.input = new EventEmitter(); // This event is trigger every time the user change the color using the panel this.slider = new EventEmitter(); this.close = new EventEmitter(); this.open = new EventEmitter(); this.isDisabled = false; this.onTouchedCallback = () => { }; this.onChangeCallback = () => { }; } ngOnDestroy() { if (this.panelRef) { this.panelFactory.removePanel(); } } openPanel() { if (!this.isDisabled) { this.panelRef = this.panelFactory.createPanel(this.attachTo, this.overlayClassName); this.panelRef.instance.iniciate(this, this.triggerRef, this.color, this.palette, this.colorsAnimation, this.format, this.hideTextInput, this.hideColorPicker, this.acceptLabel, this.cancelLabel, this.colorPickerControls, this.position, this.formats); } this.open.emit(this.color); } closePanel() { this.panelFactory.removePanel(); this.onTouchedCallback(); this.close.emit(this.color); } setDisabledState(isDisabled) { this.isDisabled = isDisabled; this.triggerRef.nativeElement.style.opacity = isDisabled ? 0.5 : 1; } setColor(color, previewColor = "") { this.writeValue(color, previewColor); this.onChangeCallback(color); this.input.emit(color); } sliderChange(color) { this.slider.emit(color); } get value() { return this.color; } set value(value) { this.setColor(value); this.onChangeCallback(value); } writeValue(value, previewColor = "") { if (value !== this.color) { if (this.format) { let format = formats.indexOf(this.format.toLowerCase()); value = this.service.stringToFormat(value, format); } this.color = value; let isCmyk = false; if (value && value.startsWith('cmyk')) { isCmyk = true; if (!previewColor) { previewColor = this.service.stringToFormat(value, ColorFormats.RGBA); } } this.change.emit(isCmyk ? previewColor : value); } } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } } NgxColorsTriggerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NgxColorsTriggerDirective, deps: [{ token: i0.ElementRef }, { token: i1.PanelFactoryService }, { token: i2.ConverterService }], target: i0.ɵɵFactoryTarget.Directive }); NgxColorsTriggerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.2", type: NgxColorsTriggerDirective, selector: "[ngx-colors-trigger]", inputs: { colorsAnimation: "colorsAnimation", palette: "palette", format: "format", formats: "formats", position: "position", hideTextInput: "hideTextInput", hideColorPicker: "hideColorPicker", attachTo: "attachTo", overlayClassName: "overlayClassName", colorPickerControls: "colorPickerControls", acceptLabel: "acceptLabel", cancelLabel: "cancelLabel" }, outputs: { change: "change", input: "input", slider: "slider", close: "close", open: "open" }, host: { listeners: { "click": "onClick()" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxColorsTriggerDirective), multi: true, }, ], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NgxColorsTriggerDirective, decorators: [{ type: Directive, args: [{ selector: '[ngx-colors-trigger]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxColorsTriggerDirective), multi: true, }, ], }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.PanelFactoryService }, { type: i2.ConverterService }]; }, propDecorators: { colorsAnimation: [{ type: Input }], palette: [{ type: Input }], format: [{ type: Input }], formats: [{ type: Input }], position: [{ type: Input }], hideTextInput: [{ type: Input }], hideColorPicker: [{ type: Input }], attachTo: [{ type: Input }], overlayClassName: [{ type: Input }], colorPickerControls: [{ type: Input }], acceptLabel: [{ type: Input }], cancelLabel: [{ type: Input }], change: [{ type: Output }], input: [{ type: Output }], slider: [{ type: Output }], close: [{ type: Output }], open: [{ type: Output }], onClick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvbG9ycy10cmlnZ2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb2xvcnMvc3JjL2xpYi9kaXJlY3RpdmVzL25neC1jb2xvcnMtdHJpZ2dlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFHVCxZQUFZLEVBQ1osVUFBVSxHQUVYLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBWWhELE1BQU0sT0FBTyx5QkFBeUI7SUFtQ2IsT0FBTztRQUM1QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELFlBQ1UsVUFBc0IsRUFDdEIsWUFBaUMsRUFDakMsT0FBeUI7UUFGekIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUF0Q25DLHVDQUF1QztRQUN2Qyw4QkFBOEI7UUFDOUIsMkVBQTJFO1FBRTNFLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCx1RUFBdUU7UUFDOUQsb0JBQWUsR0FBeUIsVUFBVSxDQUFDO1FBT25ELGFBQVEsR0FBcUIsUUFBUSxDQUFDO1FBR3RDLGFBQVEsR0FBdUIsU0FBUyxDQUFDO1FBQ3pDLHFCQUFnQixHQUF1QixTQUFTLENBQUM7UUFDakQsd0JBQW1CLEdBQzFCLFNBQVMsQ0FBQztRQUNILGdCQUFXLEdBQVcsUUFBUSxDQUFDO1FBQy9CLGdCQUFXLEdBQVcsUUFBUSxDQUFDO1FBQ3hDLDZEQUE2RDtR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O2tCQVZyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7a0tBV1UsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxLQUFLO3NCQUFkLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBRWdCLE9BQU87c0JBQTdCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBDb21wb25lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgZm9yd2FyZFJlZixcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhbmVsRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYW5lbC1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BhbmVsL3BhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ3hDb2xvcnNDb2xvciB9IGZyb20gJy4uL2NsYXNlcy9jb2xvcic7XG5pbXBvcnQgeyBDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29udmVydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZm9ybWF0cyB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybWF0cyc7XG5pbXBvcnQgeyBDb2xvckZvcm1hdHMgfSBmcm9tICcuLi9lbnVtcy9mb3JtYXRzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neC1jb2xvcnMtdHJpZ2dlcl0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neENvbG9yc1RyaWdnZXJEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd4Q29sb3JzVHJpZ2dlckRpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3lcbntcbiAgLy9NYWluIGlucHV0L291dHB1dCBvZiB0aGUgY29sb3IgcGlja2VyXG4gIC8vIEBJbnB1dCgpIGNvbG9yID0gJyMwMDAwMDAnO1xuICAvLyBAT3V0cHV0KCkgY29sb3JDaGFuZ2U6RXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb2xvciA9ICcnO1xuXG4gIC8vVGhpcyBkZWZpbmVzIHRoZSB0eXBlIG9mIGFuaW1hdGlvbiBmb3IgdGhlIHBhbGF0dGUuKHNsaWRlLWluIHwgcG9wdXApXG4gIEBJbnB1dCgpIGNvbG9yc0FuaW1hdGlvbjogJ3NsaWRlLWluJyB8ICdwb3B1cCcgPSAnc2xpZGUtaW4nO1xuXG4gIC8vVGhpcyBpcyB1c2VkIHRvIHNldCBhIGN1c3RvbSBwYWxldHRlIG9mIGNvbG9ycyBpbiB0aGUgcGFuZWw7XG4gIEBJbnB1dCgpIHBhbGV0dGU6IEFycmF5PHN0cmluZz4gfCBBcnJheTxOZ3hDb2xvcnNDb2xvcj47XG5cbiAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdHM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xuICBASW5wdXQoKSBoaWRlVGV4dElucHV0OiBib29sZWFuO1xuICBASW5wdXQoKSBoaWRlQ29sb3JQaWNrZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGF0dGFjaFRvOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG92ZXJsYXlDbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgY29sb3JQaWNrZXJDb250cm9sczogJ2RlZmF1bHQnIHwgJ29ubHktYWxwaGEnIHwgJ25vLWFscGhhJyA9XG4gICAgJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBhY2NlcHRMYWJlbDogc3RyaW5nID0gJ0FDQ0VQVCc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsOiBzdHJpbmcgPSAnQ0FOQ0VMJztcbiAgLy8gVGhpcyBldmVudCBpcyB0cmlnZ2VyIGV2ZXJ5IHRpbWUgdGhlIHNlbGVjdGVkIGNvbG9yIGNoYW5nZVxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvLyBUaGlzIGV2ZW50IGlzIHRyaWdnZXIgZXZlcnkgdGltZSB0aGUgdXNlciBjaGFuZ2UgdGhlIGNvbG9yIHVzaW5nIHRoZSBwYW5lbFxuICBAT3V0cHV0KCkgaW5wdXQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8vIFRoaXMgZXZlbnQgaXMgdHJpZ2dlciBldmVyeSB0aW1lIHRoZSB1c2VyIGNoYW5nZSB0aGUgY29sb3IgdXNpbmcgdGhlIHBhbmVsXG4gIEBPdXRwdXQoKSBzbGlkZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9wZW46IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBvbkNsaWNrKCkge1xuICAgIHRoaXMub3BlblBhbmVsKCk7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0cmlnZ2VyUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcGFuZWxGYWN0b3J5OiBQYW5lbEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZTogQ29udmVydGVyU2VydmljZVxuICApIHt9XG5cbiAgcGFuZWxSZWY6IENvbXBvbmVudFJlZjxQYW5lbENvbXBvbmVudD47XG4gIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhbmVsUmVmKSB7XG4gICAgICB0aGlzLnBhbmVsRmFjdG9yeS5yZW1vdmVQYW5lbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvcGVuUGFuZWwoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucGFuZWxSZWYgPSB0aGlzLnBhbmVsRmFjdG9yeS5jcmVhdGVQYW5lbChcbiAgICAgICAgdGhpcy5hdHRhY2hUbyxcbiAgICAgICAgdGhpcy5vdmVybGF5Q2xhc3NOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5wYW5lbFJlZi5pbnN0YW5jZS5pbmljaWF0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVmLFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICB0aGlzLnBhbGV0dGUsXG4gICAgICAgIHRoaXMuY29sb3JzQW5pbWF0aW9uLFxuICAgICAgICB0aGlzLmZvcm1hdCxcbiAgICAgICAgdGhpcy5oaWRlVGV4dElucHV0LFxuICAgICAgICB0aGlzLmhpZGVDb2xvclBpY2tlcixcbiAgICAgICAgdGhpcy5hY2NlcHRMYWJlbCxcbiAgICAgICAgdGhpcy5jYW5jZWxMYWJlbCxcbiAgICAgICAgdGhpcy5jb2xvclBpY2tlckNvbnRyb2xzLFxuICAgICAgICB0aGlzLnBvc2l0aW9uLFxuICAgICAgICB0aGlzLmZvcm1hdHNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub3Blbi5lbWl0KHRoaXMuY29sb3IpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlUGFuZWwoKSB7XG4gICAgdGhpcy5wYW5lbEZhY3RvcnkucmVtb3ZlUGFuZWwoKTtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5jbG9zZS5lbWl0KHRoaXMuY29sb3IpO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy50cmlnZ2VyUmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IGlzRGlzYWJsZWQgPyAwLjUgOiAxO1xuICB9XG5cbiAgcHVibGljIHNldENvbG9yKGNvbG9yLCBwcmV2aWV3Q29sb3IgPSBcIlwiKSB7XG4gICAgdGhpcy53cml0ZVZhbHVlKGNvbG9yLCBwcmV2aWV3Q29sb3IpO1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayhjb2xvcik7XG4gICAgdGhpcy5pbnB1dC5lbWl0KGNvbG9yKTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlkZXJDaGFuZ2UoY29sb3IpIHtcbiAgICB0aGlzLnNsaWRlci5lbWl0KGNvbG9yKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldENvbG9yKHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZSwgcHJldmlld0NvbG9yID0gXCJcIikge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jb2xvcikge1xuICAgICAgaWYgKHRoaXMuZm9ybWF0KSB7XG4gICAgICAgIGxldCBmb3JtYXQgPSBmb3JtYXRzLmluZGV4T2YodGhpcy5mb3JtYXQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHZhbHVlID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvRm9ybWF0KHZhbHVlLCBmb3JtYXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2xvciA9IHZhbHVlO1xuXG4gICAgICBsZXQgaXNDbXlrID0gZmFsc2U7XG4gICAgICBpZiggdmFsdWUgJiYgdmFsdWUuc3RhcnRzV2l0aCgnY215aycpKSB7XG4gICAgICAgIGlzQ215ayA9IHRydWU7XG4gICAgICAgIGlmKCAhcHJldmlld0NvbG9yICkge1xuICAgICAgICAgIHByZXZpZXdDb2xvciA9IHRoaXMuc2VydmljZS5zdHJpbmdUb0Zvcm1hdCh2YWx1ZSwgQ29sb3JGb3JtYXRzLlJHQkEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQoIGlzQ215ayA/IHByZXZpZXdDb2xvciA6IHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cbn1cbiJdfQ==