ngx-editor
Version:
The Rich Text Editor for Angular, Built on ProseMirror
190 lines • 23.9 kB
JavaScript
import { Selection } from 'prosemirror-state';
import { chainCommands, createParagraphNear, liftEmptyBlock, newlineInCode, splitBlock, } from 'prosemirror-commands';
import { DOMParser } from 'prosemirror-model';
import { NgxEditorError } from 'ngx-editor/utils';
import MarkCommand from './commands/Mark';
import ListCommand from './commands/ListItem';
import LinkCommand from './commands/Link';
import HeadingCommand from './commands/Heading';
import ImageCommand from './commands/Image';
import TextColorCommand from './commands/TextColor';
import TextAlignCommand from './commands/TextAlign';
import { isString } from './stringUtil';
const execMark = (name, toggle = false) => {
return (state, dispatch) => {
const command = new MarkCommand(name);
if (!toggle) {
return command.apply()(state, dispatch);
}
return command.toggle()(state, dispatch);
};
};
class EditorCommands {
constructor(view) {
this.applyTrx = (tr) => {
this.state = this.state.apply(tr ?? this.tr);
this.tr = this.state.tr;
this.tr.setMeta('APPLIED_TRX', true);
};
this.dispatch = (tr) => {
this.applyTrx(tr);
};
if (!view) {
throw new NgxEditorError('Required view to initialize commands.');
}
this.view = view;
this.state = view.state;
this.tr = this.view.state.tr;
}
exec() {
// No changes applied
if (!this.tr.getMeta('APPLIED_TRX')) {
return false;
}
const forceEmit = !this.view.state.doc.eq(this.state.doc);
this.view.updateState(this.state);
const tr = this.tr
.setMeta('FORCE_EMIT', forceEmit);
this.view.dispatch(tr);
return true;
}
focus(position = 'end') {
const selection = position === 'start'
? Selection.atStart(this.state.doc)
: Selection.atEnd(this.state.doc);
this.tr.setSelection(selection);
this.applyTrx();
this.view.focus();
return this;
}
scrollIntoView() {
this.tr.scrollIntoView();
this.applyTrx();
return this;
}
insertText(text) {
this.tr.insertText(text);
this.applyTrx();
return this;
}
insertNewLine() {
const newLineCommands = [newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock];
chainCommands(...newLineCommands)(this.state, this.dispatch);
return this;
}
applyMark(name) {
execMark(name, false)(this.state, this.dispatch);
return this;
}
toggleMark(name) {
execMark(name, true)(this.state, this.dispatch);
return this;
}
bold() {
execMark('strong')(this.state, this.dispatch);
return this;
}
toggleBold() {
execMark('strong', true)(this.state, this.dispatch);
return this;
}
italics() {
execMark('em')(this.state, this.dispatch);
return this;
}
toggleItalics() {
execMark('em', true)(this.state, this.dispatch);
return this;
}
underline() {
execMark('u')(this.state, this.dispatch);
return this;
}
toggleUnderline() {
execMark('u', true)(this.state, this.dispatch);
return this;
}
strike() {
execMark('s')(this.state, this.dispatch);
return this;
}
toggleStrike() {
execMark('s', true)(this.state, this.dispatch);
return this;
}
code() {
execMark('code')(this.state, this.dispatch);
return this;
}
toggleCode() {
execMark('code', true)(this.state, this.dispatch);
return this;
}
toggleOrderedList() {
const command = new ListCommand(false);
command.toggle()(this.state, this.dispatch);
return this;
}
toggleBulletList() {
const command = new ListCommand(true);
command.toggle()(this.state, this.dispatch);
return this;
}
toggleHeading(level) {
const command = new HeadingCommand(level);
command.toggle()(this.state, this.dispatch);
return this;
}
insertLink(text, attrs) {
const command = new LinkCommand();
command.insert(text, attrs)(this.state, this.dispatch);
return this;
}
updateLink(attrs) {
const command = new LinkCommand();
command.update(attrs)(this.state, this.dispatch);
return this;
}
insertImage(src, attrs = {}) {
const command = new ImageCommand();
command.insert(src, attrs)(this.state, this.dispatch);
return this;
}
textColor(color) {
const command = new TextColorCommand('text_color');
command.apply({ color })(this.state, this.dispatch);
return this;
}
backgroundColor(color) {
const command = new TextColorCommand('text_background_color');
command.apply({ backgroundColor: color })(this.state, this.dispatch);
return this;
}
removeTextColor() {
const command = new TextColorCommand('text_color');
command.remove()(this.state, this.dispatch);
return this;
}
removeBackgroundColor() {
const command = new TextColorCommand('text_background_color');
command.remove()(this.state, this.dispatch);
return this;
}
align(p) {
const command = new TextAlignCommand(p);
command.toggle()(this.state, this.dispatch);
return this;
}
insertHTML(html) {
const { selection, schema, tr } = this.state;
const { from, to } = selection;
const element = document.createElement('div');
element.innerHTML = isString(html) ? html.trim() : html;
const slice = DOMParser.fromSchema(schema).parseSlice(element);
const transaction = tr.replaceRange(from, to, slice);
this.applyTrx(transaction);
return this;
}
}
export default EditorCommands;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yQ29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvRWRpdG9yQ29tbWFuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFNBQVMsRUFBZSxNQUFNLG1CQUFtQixDQUFDO0FBRXhFLE9BQU8sRUFDTCxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUNsRCxhQUFhLEVBQUUsVUFBVSxHQUMxQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxXQUEwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sY0FBaUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRSxPQUFPLFlBQTRCLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxnQkFBZ0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLGdCQUEyQixNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxFQUFFO0lBQ2hELE9BQU8sQ0FBQyxLQUFrQixFQUFFLFFBQW1DLEVBQUUsRUFBRTtRQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsT0FB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LFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ25CLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDN0MsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFFL0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFXLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0QsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxlQUFlLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkaXRvclN0YXRlLCBTZWxlY3Rpb24sIFRyYW5zYWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHtcbiAgY2hhaW5Db21tYW5kcywgY3JlYXRlUGFyYWdyYXBoTmVhciwgbGlmdEVtcHR5QmxvY2ssXG4gIG5ld2xpbmVJbkNvZGUsIHNwbGl0QmxvY2ssXG59IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuaW1wb3J0IHsgTmd4RWRpdG9yRXJyb3IgfSBmcm9tICduZ3gtZWRpdG9yL3V0aWxzJztcbmltcG9ydCBNYXJrQ29tbWFuZCBmcm9tICcuL2NvbW1hbmRzL01hcmsnO1xuaW1wb3J0IExpc3RDb21tYW5kIGZyb20gJy4vY29tbWFuZHMvTGlzdEl0ZW0nO1xuaW1wb3J0IExpbmtDb21tYW5kLCB7IExpbmtBdHRycyB9IGZyb20gJy4vY29tbWFuZHMvTGluayc7XG5pbXBvcnQgSGVhZGluZ0NvbW1hbmQsIHsgSGVhZGluZ0xldmVscyB9IGZyb20gJy4vY29tbWFuZHMvSGVhZGluZyc7XG5pbXBvcnQgSW1hZ2VDb21tYW5kLCB7IEltYWdlQXR0cnMgfSBmcm9tICcuL2NvbW1hbmRzL0ltYWdlJztcbmltcG9ydCBUZXh0Q29sb3JDb21tYW5kIGZyb20gJy4vY29tbWFuZHMvVGV4dENvbG9yJztcbmltcG9ydCBUZXh0QWxpZ25Db21tYW5kLCB7IEFsaWduIH0gZnJvbSAnLi9jb21tYW5kcy9UZXh0QWxpZ24nO1xuaW1wb3J0IHsgSFRNTCB9IGZyb20gJy4vdHJ1c3RlZFR5cGVzVXRpbCc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4vc3RyaW5nVXRpbCc7XG5cbmNvbnN0IGV4ZWNNYXJrID0gKG5hbWU6IHN0cmluZywgdG9nZ2xlID0gZmFsc2UpID0+IHtcbiAgcmV0dXJuIChzdGF0ZTogRWRpdG9yU3RhdGUsIGRpc3BhdGNoOiAodHI6IFRyYW5zYWN0aW9uKSA9PiB2b2lkKSA9PiB7XG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBNYXJrQ29tbWFuZChuYW1lKTtcblxuICAgIGlmICghdG9nZ2xlKSB7XG4gICAgICByZXR1cm4gY29tbWFuZC5hcHBseSgpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmQudG9nZ2xlKCkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgfTtcbn07XG5cbnR5cGUgRm9jdXNQb3NpdGlvbiA9ICdzdGFydCcgfCAnZW5kJztcblxuY2xhc3MgRWRpdG9yQ29tbWFuZHMge1xuICBwcml2YXRlIHZpZXc6IEVkaXRvclZpZXc7XG4gIHByaXZhdGUgc3RhdGU6IEVkaXRvclN0YXRlO1xuICBwcml2YXRlIHRyOiBUcmFuc2FjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3KSB7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICB0aHJvdyBuZXcgTmd4RWRpdG9yRXJyb3IoJ1JlcXVpcmVkIHZpZXcgdG8gaW5pdGlhbGl6ZSBjb21tYW5kcy4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgIHRoaXMuc3RhdGUgPSB2aWV3LnN0YXRlO1xuICAgIHRoaXMudHIgPSB0aGlzLnZpZXcuc3RhdGUudHI7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJ4ID0gKHRyPzogVHJhbnNhY3Rpb24pID0+IHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZS5hcHBseSh0ciA/PyB0aGlzLnRyKTtcbiAgICB0aGlzLnRyID0gdGhpcy5zdGF0ZS50cjtcbiAgICB0aGlzLnRyLnNldE1ldGEoJ0FQUExJRURfVFJYJywgdHJ1ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaCA9ICh0cjogVHJhbnNhY3Rpb24pOiB2b2lkID0+IHtcbiAgICB0aGlzLmFwcGx5VHJ4KHRyKTtcbiAgfTtcblxuICBleGVjKCk6IGJvb2xlYW4ge1xuICAgIC8vIE5vIGNoYW5nZXMgYXBwbGllZFxuICAgIGlmICghdGhpcy50ci5nZXRNZXRhKCdBUFBMSUVEX1RSWCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZm9yY2VFbWl0ID0gIXRoaXMudmlldy5zdGF0ZS5kb2MuZXEodGhpcy5zdGF0ZS5kb2MpO1xuICAgIHRoaXMudmlldy51cGRhdGVTdGF0ZSh0aGlzLnN0YXRlKTtcblxuICAgIGNvbnN0IHRyID0gdGhpcy50clxuICAgICAgLnNldE1ldGEoJ0ZPUkNFX0VNSVQnLCBmb3JjZUVtaXQpO1xuXG4gICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGZvY3VzKHBvc2l0aW9uOiBGb2N1c1Bvc2l0aW9uID0gJ2VuZCcpOiB0aGlzIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBwb3NpdGlvbiA9PT0gJ3N0YXJ0J1xuICAgICAgPyBTZWxlY3Rpb24uYXRTdGFydCh0aGlzLnN0YXRlLmRvYylcbiAgICAgIDogU2VsZWN0aW9uLmF0RW5kKHRoaXMuc3RhdGUuZG9jKTtcblxuICAgIHRoaXMudHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgdGhpcy5hcHBseVRyeCgpO1xuXG4gICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzY3JvbGxJbnRvVmlldygpOiB0aGlzIHtcbiAgICB0aGlzLnRyLnNjcm9sbEludG9WaWV3KCk7XG4gICAgdGhpcy5hcHBseVRyeCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaW5zZXJ0VGV4dCh0ZXh0OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnRyLmluc2VydFRleHQodGV4dCk7XG4gICAgdGhpcy5hcHBseVRyeCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaW5zZXJ0TmV3TGluZSgpOiB0aGlzIHtcbiAgICBjb25zdCBuZXdMaW5lQ29tbWFuZHMgPSBbbmV3bGluZUluQ29kZSwgY3JlYXRlUGFyYWdyYXBoTmVhciwgbGlmdEVtcHR5QmxvY2ssIHNwbGl0QmxvY2tdO1xuICAgIGNoYWluQ29tbWFuZHMoLi4ubmV3TGluZUNvbW1hbmRzKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFwcGx5TWFyayhuYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBleGVjTWFyayhuYW1lLCBmYWxzZSkodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVNYXJrKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKG5hbWUsIHRydWUpKHRoaXMuc3RhdGUsIHRoaXMuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYm9sZCgpOiB0aGlzIHtcbiAgICBleGVjTWFyaygnc3Ryb25nJykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVCb2xkKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCdzdHJvbmcnLCB0cnVlKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGl0YWxpY3MoKTogdGhpcyB7XG4gICAgZXhlY01hcmsoJ2VtJykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVJdGFsaWNzKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCdlbScsIHRydWUpKHRoaXMuc3RhdGUsIHRoaXMuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdW5kZXJsaW5lKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCd1JykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVVbmRlcmxpbmUoKTogdGhpcyB7XG4gICAgZXhlY01hcmsoJ3UnLCB0cnVlKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0cmlrZSgpOiB0aGlzIHtcbiAgICBleGVjTWFyaygncycpKHRoaXMuc3RhdGUsIHRoaXMuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9nZ2xlU3RyaWtlKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCdzJywgdHJ1ZSkodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb2RlKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCdjb2RlJykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVDb2RlKCk6IHRoaXMge1xuICAgIGV4ZWNNYXJrKCdjb2RlJywgdHJ1ZSkodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVPcmRlcmVkTGlzdCgpOiB0aGlzIHtcbiAgICBjb25zdCBjb21tYW5kID0gbmV3IExpc3RDb21tYW5kKGZhbHNlKTtcbiAgICBjb21tYW5kLnRvZ2dsZSgpKHRoaXMuc3RhdGUsIHRoaXMuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9nZ2xlQnVsbGV0TGlzdCgpOiB0aGlzIHtcbiAgICBjb25zdCBjb21tYW5kID0gbmV3IExpc3RDb21tYW5kKHRydWUpO1xuICAgIGNvbW1hbmQudG9nZ2xlKCkodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b2dnbGVIZWFkaW5nKGxldmVsOiBIZWFkaW5nTGV2ZWxzKTogdGhpcyB7XG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBIZWFkaW5nQ29tbWFuZChsZXZlbCk7XG4gICAgY29tbWFuZC50b2dnbGUoKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGluc2VydExpbmsodGV4dDogc3RyaW5nLCBhdHRyczogTGlua0F0dHJzKTogdGhpcyB7XG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBMaW5rQ29tbWFuZCgpO1xuICAgIGNvbW1hbmQuaW5zZXJ0KHRleHQsIGF0dHJzKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxpbmsoYXR0cnM6IExpbmtBdHRycyk6IHRoaXMge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgTGlua0NvbW1hbmQoKTtcbiAgICBjb21tYW5kLnVwZGF0ZShhdHRycykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpbnNlcnRJbWFnZShzcmM6IHN0cmluZywgYXR0cnM6IEltYWdlQXR0cnMgPSB7fSk6IHRoaXMge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgSW1hZ2VDb21tYW5kKCk7XG4gICAgY29tbWFuZC5pbnNlcnQoc3JjLCBhdHRycykodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0ZXh0Q29sb3IoY29sb3I6IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVGV4dENvbG9yQ29tbWFuZCgndGV4dF9jb2xvcicpO1xuICAgIGNvbW1hbmQuYXBwbHkoeyBjb2xvciB9KSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBUZXh0Q29sb3JDb21tYW5kKCd0ZXh0X2JhY2tncm91bmRfY29sb3InKTtcbiAgICBjb21tYW5kLmFwcGx5KHsgYmFja2dyb3VuZENvbG9yOiBjb2xvciB9KSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlbW92ZVRleHRDb2xvcigpOiB0aGlzIHtcbiAgICBjb25zdCBjb21tYW5kID0gbmV3IFRleHRDb2xvckNvbW1hbmQoJ3RleHRfY29sb3InKTtcbiAgICBjb21tYW5kLnJlbW92ZSgpKHRoaXMuc3RhdGUsIHRoaXMuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVtb3ZlQmFja2dyb3VuZENvbG9yKCk6IHRoaXMge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgVGV4dENvbG9yQ29tbWFuZCgndGV4dF9iYWNrZ3JvdW5kX2NvbG9yJyk7XG4gICAgY29tbWFuZC5yZW1vdmUoKSh0aGlzLnN0YXRlLCB0aGlzLmRpc3BhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFsaWduKHA6IEFsaWduKTogdGhpcyB7XG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBUZXh0QWxpZ25Db21tYW5kKHApO1xuICAgIGNvbW1hbmQudG9nZ2xlKCkodGhpcy5zdGF0ZSwgdGhpcy5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpbnNlcnRIVE1MKGh0bWw6IEhUTUwpOiB0aGlzIHtcbiAgICBjb25zdCB7IHNlbGVjdGlvbiwgc2NoZW1hLCB0ciB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBzZWxlY3Rpb247XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSBpc1N0cmluZyhodG1sKSA/IChodG1sIGFzIHN0cmluZykudHJpbSgpIDogaHRtbCBhcyBhbnk7XG4gICAgY29uc3Qgc2xpY2UgPSBET01QYXJzZXIuZnJvbVNjaGVtYShzY2hlbWEpLnBhcnNlU2xpY2UoZWxlbWVudCk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRyLnJlcGxhY2VSYW5nZShmcm9tLCB0bywgc2xpY2UpO1xuICAgIHRoaXMuYXBwbHlUcngodHJhbnNhY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdG9yQ29tbWFuZHM7XG4iXX0=