@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
178 lines • 25.7 kB
JavaScript
import { inputRules } from 'prosemirror-inputrules';
import { createInputRule } from "../../lib/utils/input-rules";
import { transformToCodeAction } from "./utils";
const validCombos = {
'**': ['_', '~~'],
'*': ['__', '~~'],
__: ['*', '~~'],
_: ['**', '~~'],
'~~': ['__', '_', '**', '*'],
};
const validRegex = (char, str) => {
for (let i = 0; i < validCombos[char].length; i++) {
const ch = validCombos[char][i];
if (ch === str) {
return true;
}
const matchLength = str.length - ch.length;
if (str.substr(matchLength, str.length) === ch) {
return validRegex(ch, str.substr(0, matchLength));
}
}
return false;
};
const ɵ0 = validRegex;
function addMark(markType, schema, charSize, char) {
return (state, match, start, end) => {
const [, prefix, textWithCombo] = match;
const to = end;
// in case of *string* pattern it matches the text from beginning of the paragraph,
// because we want ** to work for strong text
// that's why "start" argument is wrong and we need to calculate it ourselves
const from = textWithCombo ? start + prefix.length : start;
const nodeBefore = state.doc.resolve(start + prefix.length).nodeBefore;
if (prefix &&
prefix.length > 0 &&
!validRegex(char, prefix) &&
!(nodeBefore && nodeBefore.type === state.schema.nodes.hardBreak)) {
return null;
}
// fixes the following case: my `*name` is *
// expected result: should ignore special characters inside "code"
if (state.schema.marks.code &&
state.schema.marks.code.isInSet(state.doc.resolve(from + 1).marks())) {
return null;
}
// Prevent autoformatting across hardbreaks
let containsHardBreak;
state.doc.nodesBetween(from, to, node => {
if (node.type === schema.nodes.hardBreak) {
containsHardBreak = true;
return false;
}
return !containsHardBreak;
});
if (containsHardBreak) {
return null;
}
// fixes autoformatting in heading nodes: # Heading *bold*
// expected result: should not autoformat *bold*; <h1>Heading *bold*</h1>
if (state.doc.resolve(from).sameParent(state.doc.resolve(to))) {
if (!state.doc.resolve(from).parent.type.allowsMarkType(markType)) {
return null;
}
}
// apply mark to the range (from, to)
let tr = state.tr.addMark(from, to, markType.create());
if (charSize > 1) {
// delete special characters after the text
// Prosemirror removes the last symbol by itself, so we need to remove "charSize - 1" symbols
tr = tr.delete(to - (charSize - 1), to);
}
return (tr
// delete special characters before the text
.delete(from, from + charSize)
.removeStoredMark(markType));
};
}
function addCodeMark(markType, schema, specialChar) {
return (state, match, start, end) => {
if (match[1] && match[1].length > 0) {
const nodeBefore = state.doc.resolve(start + match[1].length).nodeBefore;
if (!(nodeBefore && nodeBefore.type === state.schema.nodes.hardBreak)) {
return null;
}
}
// fixes autoformatting in heading nodes: # Heading `bold`
// expected result: should not autoformat *bold*; <h1>Heading `bold`</h1>
if (state.doc.resolve(start).sameParent(state.doc.resolve(end))) {
if (!state.doc.resolve(start).parent.type.allowsMarkType(markType)) {
return null;
}
}
const regexStart = end - match[2].length + 1;
const tr = transformToCodeAction(regexStart, end, state.tr)
.delete(regexStart, regexStart + specialChar.length)
.removeStoredMark(markType);
return tr;
};
}
export const strongRegex1 = /(\S*)(\_\_([^\_\s](\_(?!\_)|[^\_])*[^\_\s]|[^\_\s])\_\_)$/;
export const strongRegex2 = /(\S*)(\*\*([^\*\s](\*(?!\*)|[^\*])*[^\*\s]|[^\*\s])\*\*)$/;
export const italicRegex1 = /(\S*[^\s\_]*)(\_([^\s\_][^\_]*[^\s\_]|[^\s\_])\_)$/;
export const italicRegex2 = /(\S*[^\s\*]*)(\*([^\s\*][^\*]*[^\s\*]|[^\s\*])\*)$/;
export const strikeRegex = /(\S*)(\~\~([^\s\~](\~(?!\~)|[^\~])*[^\s\~]|[^\s\~])\~\~)$/;
export const codeRegex = /(\S*)(`[^\s][^`]*`)$/;
/**
* Create input rules for strong mark
*
* @param {Schema} schema
* @returns {InputRule[]}
*/
function getStrongInputRules(schema) {
// **string** or __strong__ should bold the text
const markLength = 2;
const doubleUnderscoreRule = createInputRule(strongRegex1, addMark(schema.marks.strong, schema, markLength, '__'));
const doubleAsterixRule = createInputRule(strongRegex2, addMark(schema.marks.strong, schema, markLength, '**'));
return [
doubleUnderscoreRule,
doubleAsterixRule,
];
}
/**
* Create input rules for em mark
*
* @param {Schema} schema
* @returns {InputRule[]}
*/
function getItalicInputRules(schema) {
// *string* or _string_ should italic the text
const markLength = 1;
const underscoreRule = createInputRule(italicRegex1, addMark(schema.marks.em, schema, markLength, '_'));
const asterixRule = createInputRule(italicRegex2, addMark(schema.marks.em, schema, markLength, '*'));
return [
underscoreRule,
asterixRule,
];
}
/**
* Create input rules for strike mark
*
* @param {Schema} schema
* @returns {InputRule[]}
*/
function getStrikeInputRules(schema) {
const markLength = 2;
const doubleTildeRule = createInputRule(strikeRegex, addMark(schema.marks.strike, schema, markLength, '~~'));
return [doubleTildeRule];
}
/**
* Create input rules for code mark
*
* @param {Schema} schema
* @returns {InputRule[]}
*/
function getCodeInputRules(schema) {
const backTickRule = createInputRule(codeRegex, addCodeMark(schema.marks.code, schema, '`'));
return [backTickRule];
}
export function inputRulePlugin(schema) {
const rules = [];
if (schema.marks.strong) {
rules.push(...getStrongInputRules(schema));
}
if (schema.marks.em) {
rules.push(...getItalicInputRules(schema));
}
if (schema.marks.strike) {
rules.push(...getStrikeInputRules(schema));
}
if (schema.marks.code) {
rules.push(...getCodeInputRules(schema));
}
if (rules.length !== 0) {
return inputRules({ rules });
}
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5mb3JtYXR0aW5nLmlucHV0cnVsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B6b2RpYWMtdWkvZWRpdG9yLyIsInNvdXJjZXMiOlsicGx1Z2lucy90ZXh0LWZvcm1hdHRpbmcvdGV4dC5mb3JtYXR0aW5nLmlucHV0cnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFL0MsTUFBTSxXQUFXLEdBQUc7SUFDaEIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNqQixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ2pCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDZixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO0NBQy9CLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxHQUFXLEVBQVcsRUFBRTtJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUMzQyxJQUFJLEdB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QztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzFDLE1BQU0sS0FBSyxHQUFxQixFQUFFLENBQUM7SUFFbkMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUVELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDOUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM1QztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0UnVsZSwgaW5wdXRSdWxlcyB9IGZyb20gJ3Byb3NlbWlycm9yLWlucHV0cnVsZXMnO1xyXG5pbXBvcnQgeyBTY2hlbWEsIE1hcmtUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xyXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUlucHV0UnVsZSwgSW5wdXRSdWxlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9saWIvdXRpbHMvaW5wdXQtcnVsZXNcIlxyXG5pbXBvcnQgeyB0cmFuc2Zvcm1Ub0NvZGVBY3Rpb24gfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCB2YWxpZENvbWJvcyA9IHtcclxuICAgICcqKic6IFsnXycsICd+fiddLFxyXG4gICAgJyonOiBbJ19fJywgJ35+J10sXHJcbiAgICBfXzogWycqJywgJ35+J10sXHJcbiAgICBfOiBbJyoqJywgJ35+J10sXHJcbiAgICAnfn4nOiBbJ19fJywgJ18nLCAnKionLCAnKiddLFxyXG59O1xyXG5cclxuY29uc3QgdmFsaWRSZWdleCA9IChjaGFyOiBzdHJpbmcsIHN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkQ29tYm9zW2NoYXJdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2ggPSB2YWxpZENvbWJvc1tjaGFyXVtpXTtcclxuICAgICAgICBpZiAoY2ggPT09IHN0cikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2hMZW5ndGggPSBzdHIubGVuZ3RoIC0gY2gubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzdHIuc3Vic3RyKG1hdGNoTGVuZ3RoLCBzdHIubGVuZ3RoKSA9PT0gY2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkUmVnZXgoY2gsIHN0ci5zdWJzdHIoMCwgbWF0Y2hMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhZGRNYXJrKFxyXG4gICAgbWFya1R5cGU6IE1hcmtUeXBlLFxyXG4gICAgc2NoZW1hOiBTY2hlbWEsXHJcbiAgICBjaGFyU2l6ZTogbnVtYmVyLFxyXG4gICAgY2hhcjogc3RyaW5nLFxyXG4pOiBJbnB1dFJ1bGVIYW5kbGVyIHtcclxuICAgIHJldHVybiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgcHJlZml4LCB0ZXh0V2l0aENvbWJvXSA9IG1hdGNoO1xyXG4gICAgICAgIGNvbnN0IHRvID0gZW5kO1xyXG4gICAgICAgIC8vIGluIGNhc2Ugb2YgKnN0cmluZyogcGF0dGVybiBpdCBtYXRjaGVzIHRoZSB0ZXh0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGgsXHJcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50ICoqIHRvIHdvcmsgZm9yIHN0cm9uZyB0ZXh0XHJcbiAgICAgICAgLy8gdGhhdCdzIHdoeSBcInN0YXJ0XCIgYXJndW1lbnQgaXMgd3JvbmcgYW5kIHdlIG5lZWQgdG8gY2FsY3VsYXRlIGl0IG91cnNlbHZlc1xyXG4gICAgICAgIGNvbnN0IGZyb20gPSB0ZXh0V2l0aENvbWJvID8gc3RhcnQgKyBwcmVmaXgubGVuZ3RoIDogc3RhcnQ7XHJcbiAgICAgICAgY29uc3Qgbm9kZUJlZm9yZSA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0ICsgcHJlZml4Lmxlbmd0aCkubm9kZUJlZm9yZTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBwcmVmaXggJiZcclxuICAgICAgICAgICAgcHJlZml4Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgIXZhbGlkUmVnZXgoY2hhciwgcHJlZml4KSAmJlxyXG4gICAgICAgICAgICAhKG5vZGVCZWZvcmUgJiYgbm9kZUJlZm9yZS50eXBlID09PSBzdGF0ZS5zY2hlbWEubm9kZXMuaGFyZEJyZWFrKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZml4ZXMgdGhlIGZvbGxvd2luZyBjYXNlOiBteSBgKm5hbWVgIGlzICpcclxuICAgICAgICAvLyBleHBlY3RlZCByZXN1bHQ6IHNob3VsZCBpZ25vcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluc2lkZSBcImNvZGVcIlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgc3RhdGUuc2NoZW1hLm1hcmtzLmNvZGUgJiZcclxuICAgICAgICAgICAgc3RhdGUuc2NoZW1hLm1hcmtzLmNvZGUuaXNJblNldChzdGF0ZS5kb2MucmVzb2x2ZShmcm9tICsgMSkubWFya3MoKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGF1dG9mb3JtYXR0aW5nIGFjcm9zcyBoYXJkYnJlYWtzXHJcbiAgICAgICAgbGV0IGNvbnRhaW5zSGFyZEJyZWFrO1xyXG4gICAgICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIG5vZGUgPT4ge1xyXG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMuaGFyZEJyZWFrKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluc0hhcmRCcmVhayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICFjb250YWluc0hhcmRCcmVhaztcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoY29udGFpbnNIYXJkQnJlYWspIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmaXhlcyBhdXRvZm9ybWF0dGluZyBpbiBoZWFkaW5nIG5vZGVzOiAjIEhlYWRpbmcgKmJvbGQqXHJcbiAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0OiBzaG91bGQgbm90IGF1dG9mb3JtYXQgKmJvbGQqOyA8aDE+SGVhZGluZyAqYm9sZCo8L2gxPlxyXG4gICAgICAgIGlmIChzdGF0ZS5kb2MucmVzb2x2ZShmcm9tKS5zYW1lUGFyZW50KHN0YXRlLmRvYy5yZXNvbHZlKHRvKSkpIHtcclxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5kb2MucmVzb2x2ZShmcm9tKS5wYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhcHBseSBtYXJrIHRvIHRoZSByYW5nZSAoZnJvbSwgdG8pXHJcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuYWRkTWFyayhmcm9tLCB0bywgbWFya1R5cGUuY3JlYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAoY2hhclNpemUgPiAxKSB7XHJcbiAgICAgICAgICAgIC8vIGRlbGV0ZSBzcGVjaWFsIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIHRleHRcclxuICAgICAgICAgICAgLy8gUHJvc2VtaXJyb3IgcmVtb3ZlcyB0aGUgbGFzdCBzeW1ib2wgYnkgaXRzZWxmLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBcImNoYXJTaXplIC0gMVwiIHN5bWJvbHNcclxuICAgICAgICAgICAgdHIgPSB0ci5kZWxldGUodG8gLSAoY2hhclNpemUgLSAxKSwgdG8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdHJcclxuICAgICAgICAgICAgLy8gZGVsZXRlIHNwZWNpYWwgY2hhcmFjdGVycyBiZWZvcmUgdGhlIHRleHRcclxuICAgICAgICAgICAgICAgIC5kZWxldGUoZnJvbSwgZnJvbSArIGNoYXJTaXplKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZVN0b3JlZE1hcmsobWFya1R5cGUpXHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZENvZGVNYXJrKFxyXG4gICAgbWFya1R5cGU6IE1hcmtUeXBlLFxyXG4gICAgc2NoZW1hOiBTY2hlbWEsXHJcbiAgICBzcGVjaWFsQ2hhcjogc3RyaW5nLFxyXG4pOiBJbnB1dFJ1bGVIYW5kbGVyIHtcclxuICAgIHJldHVybiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgaWYgKG1hdGNoWzFdICYmIG1hdGNoWzFdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZUJlZm9yZSA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0ICsgbWF0Y2hbMV0ubGVuZ3RoKS5ub2RlQmVmb3JlO1xyXG4gICAgICAgICAgICBpZiAoIShub2RlQmVmb3JlICYmIG5vZGVCZWZvcmUudHlwZSA9PT0gc3RhdGUuc2NoZW1hLm5vZGVzLmhhcmRCcmVhaykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZpeGVzIGF1dG9mb3JtYXR0aW5nIGluIGhlYWRpbmcgbm9kZXM6ICMgSGVhZGluZyBgYm9sZGBcclxuICAgICAgICAvLyBleHBlY3RlZCByZXN1bHQ6IHNob3VsZCBub3QgYXV0b2Zvcm1hdCAqYm9sZCo7IDxoMT5IZWFkaW5nIGBib2xkYDwvaDE+XHJcbiAgICAgICAgaWYgKHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0KS5zYW1lUGFyZW50KHN0YXRlLmRvYy5yZXNvbHZlKGVuZCkpKSB7XHJcbiAgICAgICAgICAgIGlmICghc3RhdGUuZG9jLnJlc29sdmUoc3RhcnQpLnBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVnZXhTdGFydCA9IGVuZCAtIG1hdGNoWzJdLmxlbmd0aCArIDE7XHJcbiAgICAgICAgY29uc3QgdHIgPSB0cmFuc2Zvcm1Ub0NvZGVBY3Rpb24ocmVnZXhTdGFydCwgZW5kLCBzdGF0ZS50cilcclxuICAgICAgICAgICAgLmRlbGV0ZShyZWdleFN0YXJ0LCByZWdleFN0YXJ0ICsgc3BlY2lhbENoYXIubGVuZ3RoKVxyXG4gICAgICAgICAgICAucmVtb3ZlU3RvcmVkTWFyayhtYXJrVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRyO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHN0cm9uZ1JlZ2V4MSA9IC8oXFxTKikoXFxfXFxfKFteXFxfXFxzXShcXF8oPyFcXF8pfFteXFxfXSkqW15cXF9cXHNdfFteXFxfXFxzXSlcXF9cXF8pJC87XHJcbmV4cG9ydCBjb25zdCBzdHJvbmdSZWdleDIgPSAvKFxcUyopKFxcKlxcKihbXlxcKlxcc10oXFwqKD8hXFwqKXxbXlxcKl0pKlteXFwqXFxzXXxbXlxcKlxcc10pXFwqXFwqKSQvO1xyXG5leHBvcnQgY29uc3QgaXRhbGljUmVnZXgxID0gLyhcXFMqW15cXHNcXF9dKikoXFxfKFteXFxzXFxfXVteXFxfXSpbXlxcc1xcX118W15cXHNcXF9dKVxcXykkLztcclxuZXhwb3J0IGNvbnN0IGl0YWxpY1JlZ2V4MiA9IC8oXFxTKlteXFxzXFwqXSopKFxcKihbXlxcc1xcKl1bXlxcKl0qW15cXHNcXCpdfFteXFxzXFwqXSlcXCopJC87XHJcbmV4cG9ydCBjb25zdCBzdHJpa2VSZWdleCA9IC8oXFxTKikoXFx+XFx+KFteXFxzXFx+XShcXH4oPyFcXH4pfFteXFx+XSkqW15cXHNcXH5dfFteXFxzXFx+XSlcXH5cXH4pJC87XHJcbmV4cG9ydCBjb25zdCBjb2RlUmVnZXggPSAvKFxcUyopKGBbXlxcc11bXmBdKmApJC87XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBzdHJvbmcgbWFya1xyXG4gKlxyXG4gKiBAcGFyYW0ge1NjaGVtYX0gc2NoZW1hXHJcbiAqIEByZXR1cm5zIHtJbnB1dFJ1bGVbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldFN0cm9uZ0lucHV0UnVsZXMoc2NoZW1hOiBTY2hlbWEpOiBJbnB1dFJ1bGVbXSB7XHJcbiAgICAvLyAqKnN0cmluZyoqIG9yIF9fc3Ryb25nX18gc2hvdWxkIGJvbGQgdGhlIHRleHRcclxuXHJcbiAgICBjb25zdCBtYXJrTGVuZ3RoID0gMjtcclxuICAgIGNvbnN0IGRvdWJsZVVuZGVyc2NvcmVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cm9uZ1JlZ2V4MSxcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5zdHJvbmcsIHNjaGVtYSwgbWFya0xlbmd0aCwgJ19fJyksXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGRvdWJsZUFzdGVyaXhSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cm9uZ1JlZ2V4MixcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5zdHJvbmcsIHNjaGVtYSwgbWFya0xlbmd0aCwgJyoqJyksXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgZG91YmxlVW5kZXJzY29yZVJ1bGUsXHJcbiAgICAgICAgZG91YmxlQXN0ZXJpeFJ1bGUsXHJcbiAgICBdO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBlbSBtYXJrXHJcbiAqXHJcbiAqIEBwYXJhbSB7U2NoZW1hfSBzY2hlbWFcclxuICogQHJldHVybnMge0lucHV0UnVsZVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0SXRhbGljSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIC8vICpzdHJpbmcqIG9yIF9zdHJpbmdfIHNob3VsZCBpdGFsaWMgdGhlIHRleHRcclxuICAgIGNvbnN0IG1hcmtMZW5ndGggPSAxO1xyXG5cclxuICAgIGNvbnN0IHVuZGVyc2NvcmVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIGl0YWxpY1JlZ2V4MSxcclxuICAgICAgICBhZGRNYXJrKHNjaGVtYS5tYXJrcy5lbSwgc2NoZW1hLCBtYXJrTGVuZ3RoLCAnXycpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBhc3Rlcml4UnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICBpdGFsaWNSZWdleDIsXHJcbiAgICAgICAgYWRkTWFyayhzY2hlbWEubWFya3MuZW0sIHNjaGVtYSwgbWFya0xlbmd0aCwgJyonKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICB1bmRlcnNjb3JlUnVsZSxcclxuICAgICAgICBhc3Rlcml4UnVsZSxcclxuICAgIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgaW5wdXQgcnVsZXMgZm9yIHN0cmlrZSBtYXJrXHJcbiAqXHJcbiAqIEBwYXJhbSB7U2NoZW1hfSBzY2hlbWFcclxuICogQHJldHVybnMge0lucHV0UnVsZVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RyaWtlSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIGNvbnN0IG1hcmtMZW5ndGggPSAyO1xyXG4gICAgY29uc3QgZG91YmxlVGlsZGVSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIHN0cmlrZVJlZ2V4LFxyXG4gICAgICAgIGFkZE1hcmsoc2NoZW1hLm1hcmtzLnN0cmlrZSwgc2NoZW1hLCBtYXJrTGVuZ3RoLCAnfn4nKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtkb3VibGVUaWxkZVJ1bGVdO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGlucHV0IHJ1bGVzIGZvciBjb2RlIG1hcmtcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlW119XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2RlSW5wdXRSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVtdIHtcclxuICAgIGNvbnN0IGJhY2tUaWNrUnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICBjb2RlUmVnZXgsXHJcbiAgICAgICAgYWRkQ29kZU1hcmsoc2NoZW1hLm1hcmtzLmNvZGUsIHNjaGVtYSwgJ2AnKSxcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIFtiYWNrVGlja1J1bGVdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5wdXRSdWxlUGx1Z2luKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxJbnB1dFJ1bGU+ID0gW107XHJcblxyXG4gICAgaWYgKHNjaGVtYS5tYXJrcy5zdHJvbmcpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldFN0cm9uZ0lucHV0UnVsZXMoc2NoZW1hKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNjaGVtYS5tYXJrcy5lbSkge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0SXRhbGljSW5wdXRSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm1hcmtzLnN0cmlrZSkge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0U3RyaWtlSW5wdXRSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm1hcmtzLmNvZGUpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldENvZGVJbnB1dFJ1bGVzKHNjaGVtYSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChydWxlcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==