UNPKG

@zodiac-ui/editor

Version:

A rich text editor for Angular based on `@atlaskit/editor-core`.

109 lines 17.2 kB
import { textblockTypeInputRule, wrappingInputRule, inputRules, } from 'prosemirror-inputrules'; import { safeInsert } from 'prosemirror-utils'; import { createInputRule, defaultInputRuleHandler, leafNodeReplacementCharacter, } from "../../lib/utils/input-rules"; import { isConvertableToCodeBlock, transformToCodeBlockAction } from "./block-type.command"; import { insertBlock } from "./insert-block"; const MAX_HEADING_LEVEL = 6; function getHeadingLevel(match) { return { level: match[1].length, }; } export function headingRule(nodeType, maxLevel) { return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\s$'), nodeType, getHeadingLevel); } export function blockQuoteRule(nodeType) { return wrappingInputRule(/^\s*>\s$/, nodeType); } export function codeBlockRule(nodeType) { return textblockTypeInputRule(/^```$/, nodeType); } /** * Get heading rules * * @param {Schema} schema * @returns {InputRuleWithHandler[]} */ function getHeadingRules(schema) { // '# ' for h1, '## ' for h2 and etc const hashRule = defaultInputRuleHandler(headingRule(schema.nodes.heading, MAX_HEADING_LEVEL), true); const leftNodeReplacementHashRule = createInputRule(new RegExp(`${leafNodeReplacementCharacter}(#{1,6})\\s$`), (state, match, start, end) => { const level = match[1].length; return insertBlock(state, schema.nodes.heading, `heading${level}`, start, end, { level }); }, true); // Old analytics stuff const currentHandler = hashRule.handler; hashRule.handler = (state, match, start, end) => { return currentHandler(state, match, start, end); }; return [ hashRule, leftNodeReplacementHashRule, ]; } /** * Get all block quote input rules * * @param {Schema} schema * @returns {InputRuleWithHandler[]} */ function getBlockQuoteRules(schema) { // '> ' for blockquote const greatherThanRule = defaultInputRuleHandler(blockQuoteRule(schema.nodes.blockquote), true); const leftNodeReplacementGreatherRule = createInputRule(new RegExp(`${leafNodeReplacementCharacter}\\s*>\\s$`), (state, match, start, end) => { return insertBlock(state, schema.nodes.blockquote, 'blockquote', start, end); }, true); return [ greatherThanRule, leftNodeReplacementGreatherRule, ]; } /** * Get all code block input rules * * @param {Schema} schema * @returns {InputRuleWithHandler[]} */ function getCodeBlockRules(schema) { const threeTildeRule = createInputRule(/((^`{3,})|(\s`{3,}))(\S*)$/, (state, match, start, end) => { const attributes = {}; if (match[4]) { attributes.language = match[4]; } const newStart = match[0][0] === ' ' ? start + 1 : start; if (isConvertableToCodeBlock(state)) { return transformToCodeBlockAction(state, attributes) // remove markdown decorator ``` .delete(newStart, end) .scrollIntoView(); } let { tr } = state; tr = tr.delete(newStart, end); const codeBlock = state.schema.nodes.codeBlock.createChecked(); return safeInsert(codeBlock)(tr); }, true); const leftNodeReplacementThreeTildeRule = createInputRule(new RegExp(`((${leafNodeReplacementCharacter}\`{3,})|(\\s\`{3,}))(\\S*)$`), (state, match, start, end) => { const attributes = {}; if (match[4]) { attributes.language = match[4]; } return insertBlock(state, schema.nodes.codeBlock, 'codeblock', start, end, attributes); }, true); return [threeTildeRule, leftNodeReplacementThreeTildeRule]; } export function inputRulePlugin(schema) { const rules = []; if (schema.nodes.heading) { rules.push(...getHeadingRules(schema)); } if (schema.nodes.blockquote) { rules.push(...getBlockQuoteRules(schema)); } if (schema.nodes.codeBlock) { rules.push(...getCodeBlockRules(schema)); } if (rules.length !== 0) { return inputRules({ rules }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stdHlwZS5pbnB1dHJ1bGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbInBsdWdpbnMvYmxvY2stdHlwZS9ibG9jay10eXBlLmlucHV0cnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixVQUFVLEdBR2IsTUFBTSx3QkFBd0IsQ0FBQztBQUdoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsT0FBTyxFQUNILGVBQWUsRUFDZix1QkFBdUIsRUFFdkIsNEJBQTRCLEdBQy9CLE1BQU0sNkJBQTZCLENBQUE7QUFDcEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRTVCLFNBQVMsZUFBZSxDQUFDLEtBQWU7SUFDcEMsT0FBTztRQUNILEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBdUI7S0FDMUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWtCLEVBQUUsUUFBZ0I7SUFDNUQsT0FBTyxzQkFBc0IsQ0FDekIsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFDMUMsUUFBUSxFQUNSLGVBQWUsQ0FDTSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWtCO0lBQzdDLE9BQU8saUJBQWlCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBeUIsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFrQjtJQUM1QyxPQUFPLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMs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QUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM3QztJQUVELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7UUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDNUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNoQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcclxuICAgIHdyYXBwaW5nSW5wdXRSdWxlLFxyXG4gICAgaW5wdXRSdWxlcyxcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIElucHV0UnVsZSxcclxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcclxuaW1wb3J0IHsgU2NoZW1hLCBOb2RlVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcclxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xyXG5pbXBvcnQgeyBzYWZlSW5zZXJ0IH0gZnJvbSAncHJvc2VtaXJyb3ItdXRpbHMnO1xyXG5pbXBvcnQgeyBIZWFkaW5nTGV2ZWxzIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiXHJcbmltcG9ydCB7XHJcbiAgICBjcmVhdGVJbnB1dFJ1bGUsXHJcbiAgICBkZWZhdWx0SW5wdXRSdWxlSGFuZGxlcixcclxuICAgIElucHV0UnVsZVdpdGhIYW5kbGVyLFxyXG4gICAgbGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3RlcixcclxufSBmcm9tIFwiLi4vLi4vbGliL3V0aWxzL2lucHV0LXJ1bGVzXCJcclxuaW1wb3J0IHsgaXNDb252ZXJ0YWJsZVRvQ29kZUJsb2NrLCB0cmFuc2Zvcm1Ub0NvZGVCbG9ja0FjdGlvbiB9IGZyb20gXCIuL2Jsb2NrLXR5cGUuY29tbWFuZFwiXHJcbmltcG9ydCB7IGluc2VydEJsb2NrIH0gZnJvbSBcIi4vaW5zZXJ0LWJsb2NrXCJcclxuXHJcbmNvbnN0IE1BWF9IRUFESU5HX0xFVkVMID0gNjtcclxuXHJcbmZ1bmN0aW9uIGdldEhlYWRpbmdMZXZlbChtYXRjaDogc3RyaW5nW10pOiB7IGxldmVsOiBIZWFkaW5nTGV2ZWxzIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBsZXZlbDogbWF0Y2hbMV0ubGVuZ3RoIGFzIEhlYWRpbmdMZXZlbHMsXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGVhZGluZ1J1bGUobm9kZVR5cGU6IE5vZGVUeXBlLCBtYXhMZXZlbDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGV4dGJsb2NrVHlwZUlucHV0UnVsZShcclxuICAgICAgICBuZXcgUmVnRXhwKCdeKCN7MSwnICsgbWF4TGV2ZWwgKyAnfSlcXFxccyQnKSxcclxuICAgICAgICBub2RlVHlwZSxcclxuICAgICAgICBnZXRIZWFkaW5nTGV2ZWwsXHJcbiAgICApIGFzIElucHV0UnVsZVdpdGhIYW5kbGVyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tRdW90ZVJ1bGUobm9kZVR5cGU6IE5vZGVUeXBlKSB7XHJcbiAgICByZXR1cm4gd3JhcHBpbmdJbnB1dFJ1bGUoL15cXHMqPlxccyQvLCBub2RlVHlwZSkgYXMgSW5wdXRSdWxlV2l0aEhhbmRsZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb2RlQmxvY2tSdWxlKG5vZGVUeXBlOiBOb2RlVHlwZSkge1xyXG4gICAgcmV0dXJuIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL15gYGAkLywgbm9kZVR5cGUpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGhlYWRpbmcgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldEhlYWRpbmdSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVdpdGhIYW5kbGVyW10ge1xyXG4gICAgLy8gJyMgJyBmb3IgaDEsICcjIyAnIGZvciBoMiBhbmQgZXRjXHJcbiAgICBjb25zdCBoYXNoUnVsZSA9IGRlZmF1bHRJbnB1dFJ1bGVIYW5kbGVyKFxyXG4gICAgICAgIGhlYWRpbmdSdWxlKHNjaGVtYS5ub2Rlcy5oZWFkaW5nLCBNQVhfSEVBRElOR19MRVZFTCksXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGVmdE5vZGVSZXBsYWNlbWVudEhhc2hSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3Rlcn0oI3sxLDZ9KVxcXFxzJGApLFxyXG4gICAgICAgIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBtYXRjaFsxXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnRCbG9jayhcclxuICAgICAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmhlYWRpbmcsXHJcbiAgICAgICAgICAgICAgICBgaGVhZGluZyR7bGV2ZWx9YCxcclxuICAgICAgICAgICAgICAgIHN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgZW5kLFxyXG4gICAgICAgICAgICAgICAgeyBsZXZlbCB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gT2xkIGFuYWx5dGljcyBzdHVmZlxyXG4gICAgY29uc3QgY3VycmVudEhhbmRsZXIgPSBoYXNoUnVsZS5oYW5kbGVyO1xyXG4gICAgaGFzaFJ1bGUuaGFuZGxlciA9IChzdGF0ZSwgbWF0Y2g6IHN0cmluZ1tdLCBzdGFydCwgZW5kKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRIYW5kbGVyKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgaGFzaFJ1bGUsXHJcbiAgICAgICAgbGVmdE5vZGVSZXBsYWNlbWVudEhhc2hSdWxlLFxyXG4gICAgXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgYmxvY2sgcXVvdGUgaW5wdXQgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldEJsb2NrUXVvdGVSdWxlcyhzY2hlbWE6IFNjaGVtYSk6IElucHV0UnVsZVdpdGhIYW5kbGVyW10ge1xyXG4gICAgLy8gJz4gJyBmb3IgYmxvY2txdW90ZVxyXG4gICAgY29uc3QgZ3JlYXRoZXJUaGFuUnVsZSA9IGRlZmF1bHRJbnB1dFJ1bGVIYW5kbGVyKFxyXG4gICAgICAgIGJsb2NrUXVvdGVSdWxlKHNjaGVtYS5ub2Rlcy5ibG9ja3F1b3RlKSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsZWZ0Tm9kZVJlcGxhY2VtZW50R3JlYXRoZXJSdWxlID0gY3JlYXRlSW5wdXRSdWxlKFxyXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bGVhZk5vZGVSZXBsYWNlbWVudENoYXJhY3Rlcn1cXFxccyo+XFxcXHMkYCksXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0QmxvY2soXHJcbiAgICAgICAgICAgICAgICBzdGF0ZSxcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy5ibG9ja3F1b3RlLFxyXG4gICAgICAgICAgICAgICAgJ2Jsb2NrcXVvdGUnLFxyXG4gICAgICAgICAgICAgICAgc3RhcnQsXHJcbiAgICAgICAgICAgICAgICBlbmQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIGdyZWF0aGVyVGhhblJ1bGUsXHJcbiAgICAgICAgbGVmdE5vZGVSZXBsYWNlbWVudEdyZWF0aGVyUnVsZSxcclxuICAgIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYWxsIGNvZGUgYmxvY2sgaW5wdXQgcnVsZXNcclxuICpcclxuICogQHBhcmFtIHtTY2hlbWF9IHNjaGVtYVxyXG4gKiBAcmV0dXJucyB7SW5wdXRSdWxlV2l0aEhhbmRsZXJbXX1cclxuICovXHJcbmZ1bmN0aW9uIGdldENvZGVCbG9ja1J1bGVzKHNjaGVtYTogU2NoZW1hKTogSW5wdXRSdWxlV2l0aEhhbmRsZXJbXSB7XHJcbiAgICBjb25zdCB0aHJlZVRpbGRlUnVsZSA9IGNyZWF0ZUlucHV0UnVsZShcclxuICAgICAgICAvKCheYHszLH0pfChcXHNgezMsfSkpKFxcUyopJC8sXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxhbmd1YWdlID0gbWF0Y2hbNF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBtYXRjaFswXVswXSA9PT0gJyAnID8gc3RhcnQgKyAxIDogc3RhcnQ7XHJcbiAgICAgICAgICAgIGlmIChpc0NvbnZlcnRhYmxlVG9Db2RlQmxvY2soc3RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtVG9Db2RlQmxvY2tBY3Rpb24oc3RhdGUsIGF0dHJpYnV0ZXMpXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbWFya2Rvd24gZGVjb3JhdG9yIGBgYFxyXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGUobmV3U3RhcnQsIGVuZClcclxuICAgICAgICAgICAgICAgICAgICAuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgeyB0ciB9ID0gc3RhdGU7XHJcbiAgICAgICAgICAgIHRyID0gdHIuZGVsZXRlKG5ld1N0YXJ0LCBlbmQpO1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBzdGF0ZS5zY2hlbWEubm9kZXMuY29kZUJsb2NrLmNyZWF0ZUNoZWNrZWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNhZmVJbnNlcnQoY29kZUJsb2NrKSh0cik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBsZWZ0Tm9kZVJlcGxhY2VtZW50VGhyZWVUaWxkZVJ1bGUgPSBjcmVhdGVJbnB1dFJ1bGUoXHJcbiAgICAgICAgbmV3IFJlZ0V4cChgKCgke2xlYWZOb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJ9XFxgezMsfSl8KFxcXFxzXFxgezMsfSkpKFxcXFxTKikkYCksXHJcbiAgICAgICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxhbmd1YWdlID0gbWF0Y2hbNF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGluc2VydEJsb2NrKFxyXG4gICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICBzY2hlbWEubm9kZXMuY29kZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgJ2NvZGVibG9jaycsXHJcbiAgICAgICAgICAgICAgICBzdGFydCxcclxuICAgICAgICAgICAgICAgIGVuZCxcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gW3RocmVlVGlsZGVSdWxlLCBsZWZ0Tm9kZVJlcGxhY2VtZW50VGhyZWVUaWxkZVJ1bGVdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaW5wdXRSdWxlUGx1Z2luKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxJbnB1dFJ1bGVXaXRoSGFuZGxlcj4gPSBbXTtcclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmhlYWRpbmcpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldEhlYWRpbmdSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmJsb2NrcXVvdGUpIHtcclxuICAgICAgICBydWxlcy5wdXNoKC4uLmdldEJsb2NrUXVvdGVSdWxlcyhzY2hlbWEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLm5vZGVzLmNvZGVCbG9jaykge1xyXG4gICAgICAgIHJ1bGVzLnB1c2goLi4uZ2V0Q29kZUJsb2NrUnVsZXMoc2NoZW1hKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJ1bGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBpbnB1dFJ1bGVzKHsgcnVsZXMgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19