@joniras/ngx-editor2
Version:
WYSIWYG Editor for Angular 8+
295 lines • 65 kB
JavaScript
import { __decorate } from "tslib";
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { HttpResponse } from '@angular/common/http';
import { PopoverConfig } from 'ngx-bootstrap/popover';
import { CommandExecutorService } from '../common/services/command-executor.service';
import { MessageService } from '../common/services/message.service';
import * as Utils from '../common/utils/ngx-text-editor.utils';
import { faAlignCenter, faAlignJustify, faAlignLeft, faAlignRight, faBold, faCut, faEraser, faFileUpload, faFont, faItalic, faLink, faListOl, faListUl, faMinus, faOutdent, faParagraph, faQuoteLeft, faQuoteRight, faRedo, faStrikethrough, faSubscript, faSuperscript, faTextHeight, faTint, faUnderline, faUndo, faUnlink, faIndent, faHeading } from '@fortawesome/free-solid-svg-icons';
import { faCopy, faImage, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
import { faYoutube } from '@fortawesome/free-brands-svg-icons';
var NgxTextEditorToolbarComponent = /** @class */ (function () {
function NgxTextEditorToolbarComponent(_popOverConfig, _formBuilder, _messageService, _commandExecutorService) {
this._popOverConfig = _popOverConfig;
this._formBuilder = _formBuilder;
this._messageService = _messageService;
this._commandExecutorService = _commandExecutorService;
/** set to false when image is being uploaded */
this.uploadComplete = true;
/** upload percentage */
this.updloadPercentage = 0;
/** set to true when the image is being uploaded */
this.isUploading = false;
/** which tab to active for color insertion */
this.selectedColorTab = 'textColor';
/** font family name */
this.fontName = '';
/** font size */
this.fontSize = '';
/** hex color code */
this.hexColor = '';
/** show/hide image uploader */
this.isImageUploader = false;
this.wasH1Pressed = false;
/** Icons for the Toolbar */
this.icons = {
heading: faHeading,
bold: faBold,
italic: faItalic,
underline: faUnderline,
strikethrough: faStrikethrough,
superscript: faSuperscript,
subscript: faSubscript,
font: faFont,
textheight: faTextHeight,
tint: faTint,
alignleft: faAlignLeft,
aligncenter: faAlignCenter,
alignright: faAlignRight,
alignjustify: faAlignJustify,
indent: faIndent,
outdent: faOutdent,
scissors: faCut,
fileso: faCopy,
trash: faTrashAlt,
eraser: faEraser,
undo: faUndo,
repeat: faRedo,
paragraph: faParagraph,
quoteleft: faQuoteLeft,
quoteright: faQuoteRight,
minus: faMinus,
listul: faListUl,
listol: faListOl,
link: faLink,
chainbroken: faUnlink,
pictureo: faImage,
youtubeplay: faYoutube,
upload: faFileUpload
};
/**
* Emits an event when a toolbar button is clicked
*/
this.execute = new EventEmitter();
/**
* Emits an event then an image is selected
*/
this.uploadImage = new EventEmitter();
this._popOverConfig.outsideClick = true;
this._popOverConfig.placement = 'bottom';
this._popOverConfig.container = 'body';
}
/**
* enable or diable toolbar based on configuration
*
* @param value name of the toolbar buttons
*/
NgxTextEditorToolbarComponent.prototype.canEnableToolbarOptions = function (value) {
return Utils.canEnableToolbarOptions(value, this.config['toolbar']);
};
/**
* triggers command from the toolbar to be executed and emits an event
*
* @param command name of the command to be executed
*/
NgxTextEditorToolbarComponent.prototype.triggerCommand = function (command) {
this.execute.emit(command);
};
/**
* create URL insert form
*/
NgxTextEditorToolbarComponent.prototype.buildUrlForm = function () {
this.urlForm = this._formBuilder.group({
urlLink: ['', [Validators.required]],
urlText: ['', [Validators.required]],
urlNewTab: [true]
});
};
/**
* inserts link in the editor
*/
NgxTextEditorToolbarComponent.prototype.insertLink = function () {
try {
this._commandExecutorService.createLink(this.urlForm.value);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
/** reset form to default */
this.buildUrlForm();
/** close inset URL pop up */
this.urlPopover.hide();
};
/**
* create insert image form
*/
NgxTextEditorToolbarComponent.prototype.buildImageForm = function () {
this.imageForm = this._formBuilder.group({
imageUrl: ['', [Validators.required]]
});
};
/**
* create insert image form
*/
NgxTextEditorToolbarComponent.prototype.buildVideoForm = function () {
this.videoForm = this._formBuilder.group({
videoUrl: ['', [Validators.required]],
height: [''],
width: ['']
});
};
/**
* Executed when file is selected
*
* @param e onChange event
*/
NgxTextEditorToolbarComponent.prototype.onFileChange = function (e) {
var _this = this;
this.uploadComplete = false;
this.isUploading = true;
if (e.target.files.length > 0) {
var file = e.target.files[0];
if (!this.config.imageEndPoint) {
this.uploadImage.emit(file);
this.uploadComplete = true;
this.isUploading = false;
}
else {
try {
this._commandExecutorService.uploadImage(file, this.config.imageEndPoint).subscribe(function (event) {
if (event.type) {
_this.updloadPercentage = Math.round(100 * event.loaded / event.total);
}
if (event instanceof HttpResponse) {
try {
_this._commandExecutorService.insertImage(event.body.url);
}
catch (error) {
_this._messageService.sendMessage(error.message);
}
_this.uploadComplete = true;
_this.isUploading = false;
}
});
}
catch (error) {
this._messageService.sendMessage(error.message);
this.uploadComplete = true;
this.isUploading = false;
}
}
}
};
/** insert image in the editor */
NgxTextEditorToolbarComponent.prototype.insertImage = function () {
try {
this._commandExecutorService.insertImage(this.imageForm.value.imageUrl);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
/** reset form to default */
this.buildImageForm();
/** close inset URL pop up */
this.imagePopover.hide();
};
/** insert image in the editor */
NgxTextEditorToolbarComponent.prototype.insertVideo = function () {
try {
this._commandExecutorService.insertVideo(this.videoForm.value);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
/** reset form to default */
this.buildVideoForm();
/** close inset URL pop up */
this.videoPopover.hide();
};
/** inser text/background color */
NgxTextEditorToolbarComponent.prototype.insertColor = function (color, where) {
try {
this._commandExecutorService.insertColor(color, where);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
this.colorPopover.hide();
};
/** set font size */
NgxTextEditorToolbarComponent.prototype.setFontSize = function (fontSize) {
try {
this._commandExecutorService.setFontSize(fontSize);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
this.fontSizePopover.hide();
};
/** set font Name/family */
NgxTextEditorToolbarComponent.prototype.setFontName = function (fontName) {
try {
this._commandExecutorService.setFontName(fontName);
}
catch (error) {
this._messageService.sendMessage(error.message);
}
this.fontSizePopover.hide();
};
NgxTextEditorToolbarComponent.prototype.ngOnInit = function () {
this.buildUrlForm();
this.buildImageForm();
this.buildVideoForm();
};
NgxTextEditorToolbarComponent.prototype.toggleHeading = function (heading) {
if (!this.wasH1Pressed) {
this.execute.emit(heading);
}
else {
this.execute.emit('clear');
}
this.wasH1Pressed = !this.wasH1Pressed;
};
NgxTextEditorToolbarComponent.ctorParameters = function () { return [
{ type: PopoverConfig },
{ type: FormBuilder },
{ type: MessageService },
{ type: CommandExecutorService }
]; };
__decorate([
Input()
], NgxTextEditorToolbarComponent.prototype, "config", void 0);
__decorate([
ViewChild('urlPopover', { static: true })
], NgxTextEditorToolbarComponent.prototype, "urlPopover", void 0);
__decorate([
ViewChild('imagePopover', { static: true })
], NgxTextEditorToolbarComponent.prototype, "imagePopover", void 0);
__decorate([
ViewChild('videoPopover', { static: true })
], NgxTextEditorToolbarComponent.prototype, "videoPopover", void 0);
__decorate([
ViewChild('fontSizePopover', { static: true })
], NgxTextEditorToolbarComponent.prototype, "fontSizePopover", void 0);
__decorate([
ViewChild('colorPopover', { static: true })
], NgxTextEditorToolbarComponent.prototype, "colorPopover", void 0);
__decorate([
Output()
], NgxTextEditorToolbarComponent.prototype, "execute", void 0);
__decorate([
Output()
], NgxTextEditorToolbarComponent.prototype, "uploadImage", void 0);
NgxTextEditorToolbarComponent = __decorate([
Component({
selector: 'ngx-text-editor-toolbar',
template: "<div class=\"ngx-toolbar\" *ngIf=\"config['showToolbar']\">\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('h1')\" (click)=\"toggleHeading('h1')\"\r\n title=\"H1\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.heading\"></fa-icon><span class=\"headerNumber\">1</span>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('h2')\" (click)=\"toggleHeading('h2')\"\r\n title=\"H2\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.heading\"></fa-icon><span class=\"headerNumber\">2</span>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('h3')\" (click)=\"toggleHeading('h3')\"\r\n title=\"H3\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.heading\"></fa-icon><span class=\"headerNumber\">3</span>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('bold')\" (click)=\"triggerCommand('bold')\"\r\n title=\"{{config.toolbarTitle['bold']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.bold\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('italic')\" (click)=\"triggerCommand('italic')\"\r\n title=\"{{config.toolbarTitle['italic']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.italic\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('underline')\" (click)=\"triggerCommand('underline')\"\r\n title=\"{{config.toolbarTitle['underline']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.underline\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('strikeThrough')\" (click)=\"triggerCommand('strikeThrough')\"\r\n title=\"{{config.toolbarTitle['strikeThrough']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.strikethrough\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('superscript')\" (click)=\"triggerCommand('superscript')\"\r\n title=\"{{config.toolbarTitle['superscript']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.superscript\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('subscript')\" (click)=\"triggerCommand('subscript')\"\r\n title=\"{{config.toolbarTitle['subscript']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.subscript\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('fontName')\" (click)=\"fontName = ''\"\r\n title=\"{{config.toolbarTitle['fontName']}}\" [popover]=\"fontNameTemplate\" #fontNamePopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.font\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('fontSize')\" (click)=\"fontSize = ''\"\r\n title=\"{{config.toolbarTitle['fontSize']}}\" [popover]=\"fontSizeTemplate\" #fontSizePopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.textheight\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('color')\" (click)=\"hexColor = ''\"\r\n title=\"{{config.toolbarTitle['color']}}\" [popover]=\"insertColorTemplate\" #colorPopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.tint\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('justifyLeft')\" (click)=\"triggerCommand('justifyLeft')\"\r\n title=\"{{config.toolbarTitle['justifyLeft']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.alignleft\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('justifyCenter')\" (click)=\"triggerCommand('justifyCenter')\"\r\n title=\"{{config.toolbarTitle['justifyCenter']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.aligncenter\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('justifyRight')\" (click)=\"triggerCommand('justifyRight')\"\r\n title=\"{{config.toolbarTitle['justifyRight']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.alignright\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('justifyFull')\" (click)=\"triggerCommand('justifyFull')\"\r\n title=\"{{config.toolbarTitle['justifyFull']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.alignjustify\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('indent')\" (click)=\"triggerCommand('indent')\"\r\n title=\"{{config.toolbarTitle['indent']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.indent\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('outdent')\" (click)=\"triggerCommand('outdent')\"\r\n title=\"{{config.toolbarTitle['outdent']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.outdent\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('cut')\" (click)=\"triggerCommand('cut')\"\r\n title=\"{{config.toolbarTitle['cut']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.scissors\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('copy')\" (click)=\"triggerCommand('copy')\"\r\n title=\"{{config.toolbarTitle['copy']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.fileso\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('delete')\" (click)=\"triggerCommand('delete')\"\r\n title=\"{{config.toolbarTitle['delete']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.trash\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('removeFormat')\" (click)=\"triggerCommand('removeFormat')\"\r\n title=\"{{config.toolbarTitle['removeFormat']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.eraser\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('undo')\" (click)=\"triggerCommand('undo')\"\r\n title=\"{{config.toolbarTitle['undo']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.undo\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('redo')\" (click)=\"triggerCommand('redo')\"\r\n title=\"{{config.toolbarTitle['redo']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.repeat\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('paragraph')\" (click)=\"triggerCommand('insertParagraph')\"\r\n title=\"{{config.toolbarTitle['paragraph']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.paragraph\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('blockquote')\" (click)=\"triggerCommand('blockquote')\"\r\n title=\"{{config.toolbarTitle['blockquote']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.quoteleft\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('removeBlockquote')\" (click)=\"triggerCommand('removeBlockquote')\"\r\n title=\"{{config.toolbarTitle['removeBlockquote']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.quoteright\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('horizontalLine')\" (click)=\"triggerCommand('insertHorizontalRule')\"\r\n title=\"{{config.toolbarTitle['horizontalLine']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.minus\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('unorderedList')\" (click)=\"triggerCommand('insertUnorderedList')\"\r\n title=\"{{config.toolbarTitle['unorderedList']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.listul\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('orderedList')\" (click)=\"triggerCommand('insertOrderedList')\"\r\n title=\"{{config.toolbarTitle['orderedList']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.listol\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"ngx-toolbar-set\">\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('link')\" (click)=\"buildUrlForm()\"\r\n [popover]=\"insertLinkTemplate\" title=\"{{config.toolbarTitle['link']}}\" #urlPopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.link\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('unlink')\" (click)=\"triggerCommand('unlink')\"\r\n title=\"{{config.toolbarTitle['unlink']}}\" [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.chainbroken\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('image')\" (click)=\"buildImageForm()\"\r\n title=\"{{config.toolbarTitle['image']}}\" [popover]=\"insertImageTemplate\" #imagePopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.pictureo\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"ngx-text-editor-button\" *ngIf=\"canEnableToolbarOptions('video')\" (click)=\"buildVideoForm()\"\r\n title=\"{{config.toolbarTitle['video']}}\" [popover]=\"insertVideoTemplate\" #videoPopover=\"bs-popover\" containerClass=\"ngxePopover\"\r\n [disabled]=\"!config['enableToolbar']\">\r\n <fa-icon [icon]=\"icons.youtubeplay\"></fa-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<!-- URL Popover template -->\r\n<ng-template #insertLinkTemplate>\r\n <div class=\"ngxe-popover extra-gt\">\r\n <form [formGroup]=\"urlForm\" (ngSubmit)=\"urlForm.valid && insertLink()\" autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"urlInput\" class=\"small\">{{config.toolbarTitle['URLInput']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"URLInput\" placeholder=\"{{config.toolbarTitle['URLInput']}}\" formControlName=\"urlLink\" required>\r\n </div>\r\n <div class=\"form-group\">\r\n <label for=\"urlTextInput\" class=\"small\">{{config.toolbarTitle['urlTextInput']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"urlTextInput\" placeholder=\"{{config.toolbarTitle['urlTextInput']}}\" formControlName=\"urlText\"\r\n required>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"checkbox\" class=\"form-check-input\" id=\"urlNewTab\" formControlName=\"urlNewTab\">\r\n <label class=\"form-check-label\" for=\"urlNewTab\">{{config.toolbarTitle['urlNewTab']}}</label>\r\n </div>\r\n <button type=\"submit\" class=\"btn-primary btn-sm btn\">{{config.toolbarTitle['linkSubmit']}}</button>\r\n </form>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Image Uploader Popover template -->\r\n<ng-template #insertImageTemplate>\r\n <div class=\"ngxe-popover imgc-ctnr\">\r\n <div class=\"imgc-topbar btn-ctnr\">\r\n <button type=\"button\" class=\"btn\" [ngClass]=\"{active: isImageUploader}\" (click)=\"isImageUploader = true\">\r\n <fa-icon [icon]=\"icons.upload\"></fa-icon>\r\n </button>\r\n <button type=\"button\" class=\"btn\" [ngClass]=\"{active: !isImageUploader}\" (click)=\"isImageUploader = false\">\r\n <fa-icon [icon]=\"icons.link\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"imgc-ctnt is-image\">\r\n <div *ngIf=\"isImageUploader; else insertImageLink\"> </div>\r\n <div *ngIf=\"!isImageUploader; else imageUploder\"> </div>\r\n <ng-template #imageUploder>\r\n <div class=\"ngx-insert-img-ph\">\r\n <p *ngIf=\"uploadComplete\">{{config.toolbarTitle['chooseImage']}}</p>\r\n <p *ngIf=\"!uploadComplete\">\r\n <span>{{config.toolbarTitle['uploadingimage']}}</span>\r\n <br>\r\n <span>{{ updloadPercentage }} %</span>\r\n </p>\r\n <div class=\"ngxe-img-upl-frm\">\r\n <input type=\"file\" (change)=\"onFileChange($event)\" accept=\"image/*\" [disabled]=\"isUploading\" [style.cursor]=\"isUploading ? 'not-allowed': 'allowed'\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #insertImageLink>\r\n <form class=\"extra-gt\" [formGroup]=\"imageForm\" (ngSubmit)=\"imageForm.valid && insertImage()\" autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"imageURLInput\" class=\"small\">{{config.toolbarTitle['imageURLInput']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"imageURLInput\" placeholder=\"{{config.toolbarTitle['imageURLInput']}}\" formControlName=\"imageUrl\"\r\n required>\r\n </div>\r\n <button type=\"submit\" class=\"btn-primary btn-sm btn\">{{config.toolbarTitle['imageSubmit']}}</button>\r\n </form>\r\n </ng-template>\r\n <div class=\"progress\" *ngIf=\"!uploadComplete\">\r\n <div class=\"progress-bar progress-bar-striped progress-bar-animated bg-success\" [ngClass]=\"{'bg-danger': updloadPercentage<20, 'bg-warning': updloadPercentage<50, 'bg-success': updloadPercentage>=100}\"\r\n [style.width.%]=\"updloadPercentage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- Insert Video Popover template -->\r\n<ng-template #insertVideoTemplate>\r\n <div class=\"ngxe-popover imgc-ctnr\">\r\n <div class=\"imgc-topbar btn-ctnr\">\r\n <button type=\"button\" class=\"btn active\">\r\n <fa-icon [icon]=\"icons.link\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"imgc-ctnt is-image\">\r\n <form class=\"extra-gt\" [formGroup]=\"videoForm\" (ngSubmit)=\"videoForm.valid && insertVideo()\" autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"videoURLInput\" class=\"small\">{{config.toolbarTitle['videoURLInput']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"videoURLInput\" placeholder=\"{{config.toolbarTitle['videoURLInput']}}\" formControlName=\"videoUrl\"\r\n required>\r\n </div>\r\n <div class=\"row form-group\">\r\n <div class=\"col\">\r\n <input type=\"text\" class=\"form-control-sm\" formControlName=\"height\" placeholder=\"{{config.toolbarTitle['height']}}\" pattern=\"[0-9]\">\r\n </div>\r\n <div class=\"col\">\r\n <input type=\"text\" class=\"form-control-sm\" formControlName=\"width\" placeholder=\"{{config.toolbarTitle['width']}}\" pattern=\"[0-9]\">\r\n </div>\r\n <label class=\"small\">{{config.toolbarTitle['heightwidth']}}</label>\r\n </div>\r\n <button type=\"submit\" class=\"btn-primary btn-sm btn\">{{config.toolbarTitle['videoSubmit']}}</button>\r\n </form>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Insert color template -->\r\n<ng-template #insertColorTemplate>\r\n <div class=\"ngxe-popover imgc-ctnr\">\r\n <div class=\"imgc-topbar two-tabs\">\r\n <span (click)=\"selectedColorTab ='textColor'\" [ngClass]=\"{active: selectedColorTab ==='textColor'}\">{{config.toolbarTitle['textColor']}}</span>\r\n <span (click)=\"selectedColorTab ='backgroundColor'\" [ngClass]=\"{active: selectedColorTab ==='backgroundColor'}\">{{config.toolbarTitle['backgroundColor']}}</span>\r\n </div>\r\n <div class=\"imgc-ctnt is-color extra-gt1\">\r\n <form autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"hexInput\" class=\"small\">{{config.toolbarTitle['hexInput']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"hexInput\" name=\"hexInput\" maxlength=\"7\" placeholder=\"{{config.toolbarTitle['hexInput']}}\"\r\n [(ngModel)]=\"hexColor\" required>\r\n </div>\r\n <button type=\"button\" class=\"btn-primary btn-sm btn\" (click)=\"insertColor(hexColor, selectedColorTab)\">{{config.toolbarTitle['hexSubmit']}}</button>\r\n </form>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- font size template -->\r\n<ng-template #fontSizeTemplate>\r\n <div class=\"ngxe-popover extra-gt1\">\r\n <form autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"fontSize\" class=\"small\">{{config.toolbarTitle['fontSize']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"fontSize\" name=\"fontSize\" placeholder=\"{{config.toolbarTitle['fontSize']}} (px/rem)\"\r\n [(ngModel)]=\"fontSize\" required>\r\n </div>\r\n <button type=\"button\" class=\"btn-primary btn-sm btn\" (click)=\"setFontSize(fontSize)\">{{config.toolbarTitle['fontSubmit']}}</button>\r\n </form>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- font family/name template -->\r\n<ng-template #fontNameTemplate>\r\n <div class=\"ngxe-popover extra-gt1\">\r\n <form autocomplete=\"off\">\r\n <div class=\"form-group\">\r\n <label for=\"fontSize\" class=\"small\">{{config.toolbarTitle['fontName']}}</label>\r\n <input type=\"text\" class=\"form-control-sm\" id=\"fontSize\" name=\"fontName\" placeholder=\"{{config.toolbarTitle['example']}} 'Times New Roman', Times, serif\"\r\n [(ngModel)]=\"fontName\" required>\r\n </div>\r\n <button type=\"button\" class=\"btn-primary btn-sm btn\" (click)=\"setFontName(fontName)\">{{config.toolbarTitle['fontSubmit']}}</button>\r\n </form>\r\n </div>\r\n</ng-template>\r\n",
providers: [PopoverConfig],
styles: ["::ng-deep .ngxePopover.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}::ng-deep .ngxePopover.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}::ng-deep .ngxePopover.popover .arrow::after,::ng-deep .ngxePopover.popover .arrow::before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}::ng-deep .ngxePopover.popover .popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}::ng-deep .ngxePopover.popover .popover-header:empty{display:none}::ng-deep .ngxePopover.popover .popover-body{padding:.5rem .75rem;color:#212529}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top],::ng-deep .ngxePopover.popover.bs-popover-top{margin-bottom:.5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top] .arrow,::ng-deep .ngxePopover.popover.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-top .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=top] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right],::ng-deep .ngxePopover.popover.bs-popover-right{margin-left:.5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right] .arrow,::ng-deep .ngxePopover.popover.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-right .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=right] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom],::ng-deep .ngxePopover.popover.bs-popover-bottom{margin-top:.5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .arrow,::ng-deep .ngxePopover.popover.bs-popover-bottom .arrow{left:45%!important;top:calc((.5rem + 1px) * -1)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-bottom .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before,::ng-deep .ngxePopover.popover.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left],::ng-deep .ngxePopover.popover.bs-popover-left{margin-right:.5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left] .arrow,::ng-deep .ngxePopover.popover.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-left .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left] .arrow::before,::ng-deep .ngxePopover.popover.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}::ng-deep .ngxePopover.popover.bs-popover-auto[x-placement^=left] .arrow::after,::ng-deep .ngxePopover.popover.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}::ng-deep .ngxePopover .btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}::ng-deep .ngxePopover .btn.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}::ng-deep .ngxePopover .btn:active,::ng-deep .ngxePopover .btn:focus{outline:0;box-shadow:none}::ng-deep .ngxePopover .btn.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}::ng-deep .ngxePopover .btn.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}::ng-deep .ngxePopover .btn:not(:disabled):not(.disabled){cursor:pointer}::ng-deep .ngxePopover form .form-group{margin-bottom:1rem}::ng-deep .ngxePopover form .form-group input{overflow:visible}::ng-deep .ngxePopover form .form-group .form-control-sm{width:100%;outline:0;border:none;border-bottom:1px solid #bdbdbd;border-radius:0;margin-bottom:1px;padding:.25rem .5rem;font-size:.875rem;line-height:1.5}::ng-deep .ngxePopover form .form-group.row{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0}::ng-deep .ngxePopover form .form-group.row .col{flex-basis:0;flex-grow:1;max-width:100%;padding:0}::ng-deep .ngxePopover form .form-group.row .col:first-child{padding-right:15px}::ng-deep .ngxePopover form .form-check{position:relative;display:block;padding-left:1.25rem}::ng-deep .ngxePopover form .form-check .form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.ngx-toolbar{display:flex;flex-wrap:wrap;background-color:#f5f5f5;font-size:.8rem;padding:.2rem .2rem 0;border:1px solid #ddd}.ngx-toolbar .ngx-toolbar-set{display:flex;border-radius:5px;background-color:#fff;margin-right:.2rem;margin-bottom:.2rem}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button{background-color:transparent;padding:.4rem;min-width:2.5rem;border:1px solid #ddd;border-right:transparent}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button .headerNumber{font-size:15px;top:1px;position:relative;left:1px;font-weight:700}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button.focus,.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button:focus{outline:0}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button:last-child{border-right:1px solid #ddd;border-top-right-radius:5px;border-bottom-right-radius:5px}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button:first-child{border-top-left-radius:5px;border-bottom-left-radius:5px}.ngx-toolbar .ngx-toolbar-set .ngx-text-editor-button:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}::ng-deep .popover{border-top-right-radius:0;border-top-left-radius:0}::ng-deep .ngxe-popover{min-width:15rem;white-space:nowrap}::ng-deep .ngxe-popover .extra-gt,::ng-deep .ngxe-popover.extra-gt{padding-top:.5rem!important}::ng-deep .ngxe-popover .extra-gt1,::ng-deep .ngxe-popover.extra-gt1{padding-top:.75rem!important}::ng-deep .ngxe-popover .extra-gt2,::ng-deep .ngxe-popover.extra-gt2{padding-top:1rem!important}::ng-deep .ngxe-popover .form-group label{display:none;margin:0}::ng-deep .ngxe-popover .form-group .form-control-sm{width:100%;outline:0;border:none;border-bottom:1px solid #bdbdbd;border-radius:0;margin-bottom:1px;padding-left:0;padding-right:0}::ng-deep .ngxe-popover .form-group .form-control-sm:active,::ng-deep .ngxe-popover .form-group .form-control-sm:focus{border-bottom:2px solid #1e88e5;box-shadow:none;margin-bottom:0}::ng-deep .ngxe-popover .form-group .form-control-sm.ng-dirty.ng-invalid:not(.ng-pristine){border-bottom:2px solid red}::ng-deep .ngxe-popover .form-check{margin-bottom:1rem}::ng-deep .ngxe-popover .btn:focus{box-shadow:none!important}::ng-deep .ngxe-popover.imgc-ctnr{margin:-.5rem -.75rem}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);border-bottom:0}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.btn-ctnr button{background-color:transparent;border-radius:0}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.btn-ctnr button:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.btn-ctnr button.active{color:#007bff;transition:.2s}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.two-tabs span{width:50%;display:inline-flex;justify-content:center;padding:.4rem 0;margin:0 -1px 2px}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.two-tabs span:hover{cursor:pointer}::ng-deep .ngxe-popover.imgc-ctnr .imgc-topbar.two-tabs span.active{margin-bottom:-2px;border-bottom:2px solid #007bff;color:#007bff}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt{padding:.5rem}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image .progress{height:.5rem;margin:.5rem -.5rem -.6rem}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image p{margin:0}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image .ngx-insert-img-ph{border:2px dashed #bdbdbd;padding:1.8rem 0;position:relative;letter-spacing:1px;text-align:center}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image .ngx-insert-img-ph:hover{background:#ebebeb}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image .ngx-insert-img-ph .ngxe-img-upl-frm{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;z-index:2147483640;overflow:hidden;margin:0;padding:0;width:100%}::ng-deep .ngxe-popover.imgc-ctnr .imgc-ctnt.is-image .ngx-insert-img-ph .ngxe-img-upl-frm input{cursor:pointer;position:absolute;right:0;top:0;bottom:0;margin:0}"]
})
], NgxTextEditorToolbarComponent);
return NgxTextEditorToolbarComponent;
}());
export { NgxTextEditorToolbarComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRleHQtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGpvbmlyYXMvbmd4LWVkaXRvcjIvIiwic291cmNlcyI6WyJuZ3gtdGV4dC1lZGl0b3ItdG9vbGJhci9uZ3gtdGV4dC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xFLE9BQU8sS0FBSyxLQUFLLE1BQU0sdUNBQXVDLENBQUM7QUFDL0QsT0FBTyxFQUNMLGFBQWEsRUFDYixjQUFjLEVBQ2QsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsU0FBUyxFQUNULFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBQ2YsV0FBVyxFQUNYLGFBQWEsRUFDYixZQUFZLEVBQ1osTUFBTSxFQUNOLFdBQVcsRUFDWCxNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxF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