diff --git a/codex-editor.css b/codex-editor.css index a15933fe..74efbd5b 100644 --- a/codex-editor.css +++ b/codex-editor.css @@ -396,6 +396,100 @@ 100% { background-position: -56% 0 } } +/** +* Comments styles +*/ + +.ce-comments-side { + position: absolute; + top: 0; + left: 0; + z-index: 10; + width: 200px; +} + +.ce-comments--highlight { + border-bottom: 2px #feff63 solid; +} + +.ce-comments--highlight_hover, +.ce-comments--highlight:hover { + background: #feff63; +} + +.ce-comments-field { + position: absolute; + width: 200px; + border-radius: 5px; + background: #fff; + z-index: 10; +} + +.ce-comments-field:not(:empty) { + padding: 15px; + border: 1px #ccc solid; +} + +.ce-comment__wrapper { + float: left; + width: 100%; + padding: 10px; + margin-bottom: 10px; + background: #fff; + border-radius: 10px; + border: 1px solid #fff; +} + +.ce-comment__wrapper:hover, +.ce-comment__wrapper_hover { + border: 1px solid #eee; +} + +.ce-comment__input { + width: 90%; + height: 20px; + outline: none; + border: none; + border-bottom: 1px #ccc solid; + font-size: 15px; + tab-index: 1; + resize: vertical; +} + +.ce-comment__send-button { + float: right; + color: #ccc; + font-size: 13px; + cursor: pointer; +} + +.ce-comment__text { + font-size: 15px; + border-bottom: 1px #ccc solid; + word-wrap: break-word; +} + +.ce-comment__time { + float: right; + color: #ccc; + font-size: 13px; +} + +.ce-comment__delete-button { + float: left; + color: #ccc; + font-size: 13px; + cursor: pointer; +} + +.ce-comment__edit-button { + float: left; + margin-left: 5px; + color: #ccc; + font-size: 13px; + cursor: pointer; +} + /** * Mobile viewport styles diff --git a/codex-editor.js b/codex-editor.js index 53dddbd7..13df5556 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -107,6 +107,7 @@ var codex = codex.nodes = { textarea: null, wrapper: null, + commentsSide: null, toolbar: null, inlineToolbar: { wrapper: null, @@ -412,7 +413,7 @@ var codex = */ ui.make = function () { - var wrapper, toolbar, toolbarContent, inlineToolbar, redactor, ceBlock, notifications, blockButtons, blockSettings, showSettingsButton, showCommentButton, showTrashButton, toolbox, plusButton; + var wrapper, toolbar, toolbarContent, inlineToolbar, commentsSide, redactor, ceBlock, notifications, blockButtons, blockSettings, showSettingsButton, showTrashButton, toolbox, plusButton; /** Make editor wrapper */ wrapper = codex.draw.wrapper(); @@ -430,12 +431,12 @@ var codex = inlineToolbar = codex.draw.inlineToolbar(); plusButton = codex.draw.plusButton(); showSettingsButton = codex.draw.settingsButton(); - showCommentButton = codex.draw.commentButton(); showTrashButton = codex.toolbar.settings.makeRemoveBlockButton(); blockSettings = codex.draw.blockSettings(); blockButtons = codex.draw.blockButtons(); toolbox = codex.draw.toolbox(); redactor = codex.draw.redactor(); + commentsSide = codex.draw.commentsSide(); /** settings */ var defaultSettings = codex.draw.defaultSettings(), @@ -450,7 +451,6 @@ var codex = */ blockButtons.appendChild(showSettingsButton); blockButtons.appendChild(showTrashButton); - blockButtons.appendChild(showCommentButton); blockButtons.appendChild(blockSettings); /** Append plus button */ @@ -465,12 +465,15 @@ var codex = /** Append toolbarContent to toolbar */ toolbar.appendChild(toolbarContent); + wrapper.appendChild(commentsSide); + wrapper.appendChild(toolbar); wrapper.appendChild(redactor); /** Save created ui-elements to static nodes state */ codex.nodes.wrapper = wrapper; + codex.nodes.commentsSide = commentsSide; codex.nodes.toolbar = toolbar; codex.nodes.plusButton = plusButton; codex.nodes.toolbox = toolbox; @@ -479,7 +482,6 @@ var codex = codex.nodes.defaultSettings = defaultSettings; codex.nodes.showSettingsButton = showSettingsButton; codex.nodes.showTrashButton = showTrashButton; - codex.nodes.showCommentButton = showCommentButton; codex.nodes.redactor = redactor; @@ -578,6 +580,11 @@ var codex = link: { icon: 'ce-icon-link', command: 'createLink' + }, + + comment: { + icon: 'ce-icon-newspaper', + command: 'addComment' } }; @@ -630,11 +637,6 @@ var codex = */ codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false); - /** - * Clicks to COMMENT button in toolbar - */ - codex.nodes.showCommentButton.addEventListener('click', codex.callback.showCommentButtonClicked, false); - /** * @deprecated ( but now in use for syncronization ); * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text @@ -899,6 +901,15 @@ var codex = } }; + renderer.appendComments = function () { + + var comments = codex.state.blocks.comments; + + for (var i = 0; i < comments.length; i++) { + codex.comments.makeComment(comments[i]); + } + }; + /** * Append node at specified index */ @@ -924,7 +935,7 @@ var codex = .then(function (blockData) { /** - * blockData has 'block', 'type' and 'stretched' information + * blockData has 'block', 'type', 'id' and 'stretched' information */ codex.content.insertBlock(blockData); @@ -936,6 +947,8 @@ var codex = .catch(function (error) { codex.core.log('Node skipped while parsing because %o', 'error', error); }); + + return nodeSequence; }; /** @@ -967,7 +980,8 @@ var codex = /** New parser */ var pluginName = blockData.type, - cover = blockData.cover; + cover = blockData.cover, + id = blockData.id || +new Date(); /** Get first key of object that stores plugin name */ // for (var pluginName in blockData) break; @@ -994,7 +1008,8 @@ var codex = type: pluginName, block: block, stretched: stretched, - cover: cover + cover: cover, + id: id }; }; @@ -1081,7 +1096,7 @@ var codex = } /** Result saver */ - var blockContent = block.childNodes[0], + var blockContent = block.childNodes[1], pluginsContent = blockContent.childNodes[0], savedData = codex.tools[pluginName].save(pluginsContent), output; @@ -1094,22 +1109,38 @@ var codex = /** Marks Blocks that will be in main page */ output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); + output.id = block.dataset.id; + codex.state.jsonOutput.push(output); }; saver.saveComments = function () { - var comments = codex.nodes.redactor.querySelectorAll('.ce-comment__wrapper'); + var comments = [], + wrappers = codex.nodes.commentsSide.querySelectorAll('.ce-comment__wrapper'); - for (var i = 0; i < comments.length; i++) { + for (var i = 0; i < wrappers.length; i++) { - var comment = { - blockId: comments[i].dataset.blockId, - text: comments[i].querySelector('.ce-comment__input').value - }; + var text = wrappers[i].querySelector('.ce-comment__text'), + time = wrappers[i].querySelector('.ce-comment__time'), + blockId = wrappers[i].dataset.blockId, + commentId = wrappers[i].dataset.commentId, + selectionStart = wrappers[i].dataset.selectionStart, + selectionEnd = wrappers[i].dataset.selectionEnd; - codex.state.comments.push(comment); + if (text && time) { + comments.push({ + text: text.textContent, + time: time.textContent, + 'block-id': blockId, + 'comment-id': commentId, + 'selection-start': selectionStart, + 'selection-end': selectionEnd + }); + } } + + codex.state.comments = comments; }; return saver; @@ -1295,10 +1326,11 @@ var codex = var workingBlock = codex.content.currentNode, newBlockContent = blockData.block, blockType = blockData.type, + blockId = blockData.id, cover = blockData.cover, isStretched = blockData.stretched; - var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); + var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched, blockId); if (cover === true) { newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); @@ -1456,7 +1488,7 @@ var codex = /** * @private */ - content.composeNewBlock = function (block, tool, isStretched) { + content.composeNewBlock = function (block, tool, isStretched, id) { var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}), blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {}); @@ -1469,7 +1501,7 @@ var codex = } newBlock.dataset.tool = tool; - newBlock.dataset.id = +new Date(); + newBlock.dataset.id = id || +new Date(); return newBlock; }; @@ -2165,6 +2197,8 @@ var codex = switch (type) { case 'createLink': codex.toolbar.inline.createLinkAction(event, type);break; + case 'addComment': + codex.toolbar.inline.addCommentAction(event, type);break; default: codex.toolbar.inline.defaultToolAction(type);break; } @@ -2387,6 +2421,16 @@ var codex = document.execCommand(type, false, null); }; + inline.addCommentAction = function (event, type) { + + var currentNode = codex.content.currentNode, + selection = window.getSelection(); + + codex.toolbar.inline.close(); + + codex.comments.add(currentNode, selection); + }; + /** * @private * @@ -2940,6 +2984,10 @@ var codex = callbacks.redactorClicked = function (event) { + if (event.target.classList.contains('ce-comments-field')) { + event.target.dispatchEvent(event);return; + } + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -3431,15 +3479,69 @@ var codex = codex.toolbar.settings.hideRemoveActions(); }; - /** - * Clicks on block comment button - */ - callbacks.showCommentButtonClicked = function () { + callbacks.commentInputChanged = function (e) { - codex.comments.add(codex.content.currentNode); + var input = e.path[0], + wrapper = e.path[1], + sendButton = codex.draw.commentSendButton(); - codex.toolbar.toolbox.close(); - codex.toolbar.settings.hideRemoveActions(); + if (input.value.trim() != '') { + + if (!wrapper.querySelector('.ce-comment__send-button')) wrapper.appendChild(sendButton); + } else { + + var button = wrapper.querySelector('.ce-comment__send-button'); + if (button) wrapper.removeChild(button); + } + }; + + callbacks.commentHovered = function (e) { + + var target = e.target, + commentId = target.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId), + comment = codex.comments.getCommentById(commentId); + + if (!commentSelection || !comment) return; + + commentSelection.classList.add('ce-comments--highlight_hover'); + comment.classList.add('ce-comment__wrapper_hover'); + }; + + callbacks.commentBlured = function (e) { + + var target = e.target, + commentId = target.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId), + comment = codex.comments.getCommentById(commentId); + + if (!commentSelection || !comment) return; + + commentSelection.classList.remove('ce-comments--highlight_hover'); + comment.classList.remove('ce-comment__wrapper_hover'); + }; + + callbacks.commentSendButtonClicked = function (e) { + + var sendButton = e.path[0], + wrapper = e.path[1]; + + codex.comments.send(wrapper, sendButton); + }; + + callbacks.commentDeleteButtonClicked = function (e) { + + var wrapper = e.path[1]; + + codex.comments.delete(wrapper); + }; + + callbacks.commentEditButtonClicked = function (e) { + + var wrapper = e.path[1], + commentsField = e.path[2]; + + codex.comments.edit(wrapper, commentsField); }; return callbacks; @@ -3467,6 +3569,11 @@ var codex = return wrapper; }; + draw.commentsSide = function () { + + return draw.node('DIV', 'ce-comments-side'); + }; + /** * Content-editable holder */ @@ -3635,21 +3742,87 @@ var codex = return toggler; }; - draw.commentButton = function () { - var btn = draw.node('SPAN', 'ce-toolbar__comment-btn', { innerHTML: '' }); + draw.commentsField = function (id) { - return btn; + var field = draw.node('DIV', 'ce-comments-field'); + + field.dataset.id = id; + + return field; }; - draw.commentInput = function () { - var wrapper = draw.node('DIV', 'ce-comment__wrapper', { textContent: 'Ваш комментарий:' }), - input = draw.node('TEXTAREA', 'ce-comment__input'); + draw.commentInput = function (text) { + + var wrapper = draw.node('DIV', 'ce-comment__wrapper'), + input = draw.node('TEXTAREA', 'ce-comment__input', { placeholder: 'New comment' }); + + if (text) input.value = text; + + input.addEventListener('input', codex.callback.commentInputChanged); + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); wrapper.appendChild(input); return wrapper; }; + draw.commentSelection = function () { + + var wrapper = draw.node('SPAN', 'ce-comments--highlight', {}); + + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); + + return wrapper; + }; + + draw.commentSendButton = function () { + + var button = draw.node('DIV', 'ce-comment__send-button', { textContent: 'Comment' }); + + button.addEventListener('click', codex.callback.commentSendButtonClicked); + + return button; + }; + + draw.commentDeleteButton = function () { + + var button = draw.node('DIV', 'ce-comment__delete-button', { textContent: 'Delete' }); + + button.addEventListener('click', codex.callback.commentDeleteButtonClicked); + + return button; + }; + + draw.commentEditButton = function () { + + var button = draw.node('DIV', 'ce-comment__edit-button', { textContent: 'Edit' }); + + button.addEventListener('click', codex.callback.commentEditButtonClicked); + + return button; + }; + + draw.commentTmstmp = function (edited, text) { + + var edited = edited ? 'edited ' : '', + text = text || edited + new Date().toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + hour12: false + }); + + return draw.node('DIV', 'ce-comment__time', { textContent: text }); + }; + + draw.commentText = function (text) { + + return draw.node('DIV', 'ce-comment__text', { textContent: text }); + }; + /** * Redactor tools wrapper */ @@ -4291,21 +4464,124 @@ var codex = /* 18 */ /***/ function(module, exports) { - "use strict"; + 'use strict'; var comments = function (comments) { - comments.add = function (node) { + comments.add = function (node, selection) { - var id = node.dataset.id, - commentInput = codex.draw.commentInput(); + var blockId = node.dataset.id, + commentInput = codex.draw.commentInput(), + commentId = +new Date(), + highlight = codex.draw.commentSelection(), + range = selection.getRangeAt(0); - commentInput.dataset.blockId = id; + commentInput.dataset.blockId = blockId; + commentInput.dataset.commentId = commentId; + commentInput.dataset.selectionStart = range.startOffset; + commentInput.dataset.selectionEnd = range.endOffset; - node.insertBefore(commentInput, node.firstChild); - }; + highlight.dataset.commentId = commentId; - return comments; + range.surroundContents(highlight); + + codex.nodes.commentsSide.appendChild(commentInput); + commentInput.querySelector('.ce-comment__input').focus(); + }; + + comments.send = function (wrapper, sendButton) { + + var input = wrapper.querySelector('.ce-comment__input'), + time = codex.draw.commentTmstmp(wrapper.dataset.edited), + text = codex.draw.commentText(input.value), + deleteButton = codex.draw.commentDeleteButton(), + editButton = codex.draw.commentEditButton(); + + wrapper.replaceChild(text, input); + wrapper.replaceChild(time, sendButton); + wrapper.appendChild(deleteButton); + wrapper.appendChild(editButton); + }; + + comments.edit = function (wrapper, commentsField) { + + var text = wrapper.querySelector('.ce-comment__text').textContent, + sendButton = codex.draw.commentSendButton(), + newWrapper = codex.draw.commentInput(text); + + newWrapper.dataset.edited = true; + newWrapper.appendChild(sendButton); + + commentsField.replaceChild(newWrapper, wrapper); + newWrapper.querySelector('.ce-comment__input').focus(); + }; + + comments.delete = function (wrapper) { + + var commentId = wrapper.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId); + + commentSelection.className = ''; + + wrapper.parentNode.removeChild(wrapper); + }; + + comments.makeComment = function (commentData) { + + var wrapper = codex.draw.node('DIV', 'ce-comment__wrapper'), + text = codex.draw.commentText(commentData.text), + time = codex.draw.commentTmstmp(false, commentData.time), + deleteBtn = codex.draw.commentDeleteButton(), + editBtn = codex.draw.commentEditButton(); + + wrapper.dataset.blockId = commentData['block-id']; + wrapper.dataset.commentId = commentData['comment-id']; + wrapper.dataset.selectionStart = commentData['selection-start']; + wrapper.dataset.selectionEnd = commentData['selection-end']; + + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); + + wrapper.appendChild(text); + wrapper.appendChild(time); + wrapper.appendChild(deleteBtn); + wrapper.appendChild(editBtn); + + comments.createCommentSelection(commentData['comment-id'], commentData['block-id'], commentData['selection-start'], commentData['selection-end']); + + codex.nodes.commentsSide.appendChild(wrapper); + + return wrapper; + }; + + comments.getBlockById = function (id) { + return codex.nodes.redactor.querySelector('.ce-block[data-id="' + id + '"]'); + }; + + comments.getCommentSelectionById = function (id) { + return codex.nodes.redactor.querySelector('span[data-comment-id="' + id + '"]'); + }; + + comments.getCommentById = function (id) { + return codex.nodes.commentsSide.querySelector('div[data-comment-id="' + id + '"]'); + }; + + comments.createCommentSelection = function (commentId, blockId, selectionStart, selectionEnd) { + + var block = comments.getBlockById(blockId), + range = document.createRange(), + highlight = codex.draw.commentSelection(), + textNode = codex.content.getDeepestTextNodeFromPosition(block, 0); + + highlight.dataset.commentId = commentId; + + range.setStart(textNode, selectionStart); + range.setEnd(textNode, selectionEnd); + + range.surroundContents(highlight); + }; + + return comments; }({}); module.exports = comments; diff --git a/codex-editor.js.map b/codex-editor.js.map index a68804d3..57627b96 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap e666ce2c4dbe7a643fb7","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/comments.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","comments","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","showCommentButton","alertsHolder","body","settingsButton","commentButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","showCommentButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","saveComments","comment","blockId","text","querySelector","value","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","textContent","trim","removeChild","looking_from_start","Date","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","dfs","clearStyles","href","blockTags","allowedTags","needReplace","includes","tagName","isDisplayedAsBlock","replace","getAttribute","attributes","removeAttribute","sanitized","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","btn","commentInput","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode"],"mappings":"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","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e666ce2c4dbe7a643fb7","/**\r\n *\r\n */\r\n\r\n'use strict';\r\n\r\nvar editor = require('./editor');\r\nmodule.exports = editor;\r\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\r\n * @author Codex Team\r\n * @version 1.0.6\r\n */\r\n\r\nvar codex = (function(codex){\r\n\r\n var init = function() {\r\n\r\n codex.core = require('./modules/core');\r\n codex.ui = require('./modules/ui');\r\n codex.transport = require('./modules/transport');\r\n codex.renderer = require('./modules/renderer');\r\n codex.saver = require('./modules/saver');\r\n codex.content = require('./modules/content');\r\n codex.toolbar = require('./modules/toolbar/toolbar');\r\n codex.tools = require('./modules/tools');\r\n codex.callback = require('./modules/callbacks');\r\n codex.draw = require('./modules/draw');\r\n codex.caret = require('./modules/caret');\r\n codex.notifications = require('./modules/notifications');\r\n codex.parser = require('./modules/parser');\r\n codex.comments = require('./modules/comments');\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * holds initial settings\r\n */\r\n codex.settings = {\r\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\r\n textareaId: 'codex-editor',\r\n uploadImagesUrl: '/editor/transport/',\r\n\r\n // Type of block showing on empty editor\r\n initialBlockPlugin: \"paragraph\"\r\n };\r\n\r\n /**\r\n * public\r\n *\r\n * Static nodes\r\n */\r\n codex.nodes = {\r\n textarea : null,\r\n wrapper : null,\r\n toolbar : null,\r\n inlineToolbar : {\r\n wrapper : null,\r\n buttons : null,\r\n actions : null\r\n },\r\n toolbox : null,\r\n notifications : null,\r\n plusButton : null,\r\n showSettingsButton: null,\r\n showTrashButton : null,\r\n blockSettings : null,\r\n pluginSettings : null,\r\n defaultSettings : null,\r\n toolbarButtons : {}, // { type : DomEl, ... }\r\n redactor : null\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * Output state\r\n */\r\n codex.state = {\r\n jsonOutput: [],\r\n blocks : [],\r\n inputs : [],\r\n comments : []\r\n };\r\n\r\n /**\r\n * Initialization\r\n * @uses Promise cEditor.core.prepare\r\n * @param {} userSettings are :\r\n * - tools [],\r\n * - textareaId String\r\n * ...\r\n *\r\n * Load user defined tools\r\n * Tools must contain this important objects :\r\n * @param {String} type - this is a type of plugin. It can be used as plugin name\r\n * @param {String} iconClassname - this a icon in toolbar\r\n * @param {Object} make - what should plugin do, when it is clicked\r\n * @param {Object} appendCallback - callback after clicking\r\n * @param {Element} settings - what settings does it have\r\n * @param {Object} render - plugin get JSON, and should return HTML\r\n * @param {Object} save - plugin gets HTML content, returns JSON\r\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\r\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\r\n *\r\n * @example\r\n * - type : 'header',\r\n * - iconClassname : 'ce-icon-header',\r\n * - make : headerTool.make,\r\n * - appendCallback : headerTool.appendCallback,\r\n * - settings : headerTool.makeSettings(),\r\n * - render : headerTool.render,\r\n * - save : headerTool.save,\r\n * - displayInToolbox : true,\r\n * - enableLineBreaks : false\r\n */\r\n codex.start = function (userSettings) {\r\n\r\n init();\r\n\r\n this.core.prepare(userSettings)\r\n\r\n // If all ok, make UI, bind events and parse initial-content\r\n .then(this.ui.make)\r\n .then(this.ui.addTools)\r\n .then(this.ui.bindEvents)\r\n .then(this.ui.preparePlugins)\r\n .then(this.transport.prepare)\r\n .then(this.renderer.makeBlocksFromData)\r\n .then(this.ui.saveInputs)\r\n .catch(function (error) {\r\n codex.core.log('Initialization failed with error: %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n return codex;\r\n\r\n})({});\r\n\r\nmodule.exports = codex;\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","var core = (function(core) {\r\n\r\n /**\r\n * @public\r\n *\r\n * Editor preparing method\r\n * @return Promise\r\n */\r\n core.prepare = function (userSettings) {\r\n\r\n return new Promise(function(resolve, reject) {\r\n\r\n if ( userSettings ){\r\n\r\n codex.settings.tools = userSettings.tools || codex.settings.tools;\r\n\r\n }\r\n\r\n if (userSettings.data) {\r\n codex.state.blocks = userSettings.data;\r\n }\r\n\r\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\r\n\r\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\r\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\r\n } else {\r\n resolve();\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Logging method\r\n * @param type = ['log', 'info', 'warn']\r\n */\r\n core.log = function (msg, type, arg) {\r\n\r\n type = type || 'log';\r\n\r\n if (!arg) {\r\n arg = msg || 'undefined';\r\n msg = '[codex-editor]: %o';\r\n } else {\r\n msg = '[codex-editor]: ' + msg;\r\n }\r\n\r\n try{\r\n if ( 'console' in window && console[ type ] ){\r\n if ( arg ) console[ type ]( msg , arg );\r\n else console[ type ]( msg );\r\n }\r\n\r\n }catch(e){}\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Helper for insert one element after another\r\n */\r\n core.insertAfter = function (target, element) {\r\n target.parentNode.insertBefore(element, target.nextSibling);\r\n };\r\n\r\n /**\r\n * @const\r\n *\r\n * Readable DOM-node types map\r\n */\r\n core.nodeTypes = {\r\n TAG : 1,\r\n TEXT : 3,\r\n COMMENT : 8\r\n };\r\n\r\n /**\r\n * @const\r\n * Readable keys map\r\n */\r\n core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Check object for DOM node\r\n */\r\n core.isDomNode = function (el) {\r\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\r\n };\r\n\r\n /**\r\n * Native Ajax\r\n */\r\n core.ajax = function (data) {\r\n\r\n if (!data || !data.url){\r\n return;\r\n }\r\n\r\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\r\n success_function = function(){},\r\n params = '',\r\n obj;\r\n\r\n data.async = true;\r\n data.type = data.type || 'GET';\r\n data.data = data.data || '';\r\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\r\n success_function = data.success || success_function ;\r\n\r\n if (data.type == 'GET' && data.data) {\r\n\r\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\r\n\r\n } else {\r\n\r\n for(obj in data.data) {\r\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\r\n }\r\n }\r\n\r\n if (data.withCredentials) {\r\n XMLHTTP.withCredentials = true;\r\n }\r\n\r\n if (data.beforeSend && typeof data.beforeSend == 'function') {\r\n data.beforeSend.call();\r\n }\r\n\r\n XMLHTTP.open( data.type, data.url, data.async );\r\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\r\n\r\n XMLHTTP.onreadystatechange = function() {\r\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\r\n success_function(XMLHTTP.responseText);\r\n }\r\n };\r\n\r\n XMLHTTP.send(params);\r\n };\r\n\r\n /** Appends script to head of document */\r\n core.importScript = function(scriptPath, instanceName) {\r\n\r\n /** Script is already loaded */\r\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\r\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\r\n return;\r\n }\r\n\r\n\r\n var script = document.createElement('SCRIPT');\r\n script.type = \"text/javascript\";\r\n script.src = scriptPath;\r\n script.async = true;\r\n script.defer = true;\r\n\r\n if (instanceName) {\r\n script.id = \"ce-script-\" + instanceName;\r\n }\r\n\r\n document.head.appendChild(script);\r\n return script;\r\n };\r\n\r\n return core;\r\n\r\n})({});\r\n\r\nmodule.exports = core;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var ui = (function(ui){\r\n\r\n /**\r\n * Basic editor classnames\r\n */\r\n ui.className = {\r\n\r\n /**\r\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\r\n */\r\n BLOCK_CLASSNAME : 'ce-block',\r\n\r\n /**\r\n * @const {String} wrapper for plugins content\r\n */\r\n BLOCK_CONTENT : 'ce-block__content',\r\n\r\n /**\r\n * @const {String} BLOCK_STRETCHED - makes block stretched\r\n */\r\n BLOCK_STRETCHED : 'ce-block--stretched',\r\n\r\n /**\r\n * @const {String} BLOCK_HIGHLIGHTED - adds background\r\n */\r\n BLOCK_HIGHLIGHTED : 'ce-block--focused',\r\n\r\n /**\r\n * @const {String} - highlights covered blocks\r\n */\r\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\r\n\r\n /**\r\n * @const {String} - for all default settings\r\n */\r\n SETTINGS_ITEM : 'ce-settings__item'\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Making main interface\r\n */\r\n ui.make = function () {\r\n\r\n var wrapper,\r\n toolbar,\r\n toolbarContent,\r\n inlineToolbar,\r\n redactor,\r\n ceBlock,\r\n notifications,\r\n blockButtons,\r\n blockSettings,\r\n showSettingsButton,\r\n showCommentButton,\r\n showTrashButton,\r\n toolbox,\r\n plusButton;\r\n\r\n /** Make editor wrapper */\r\n wrapper = codex.draw.wrapper();\r\n\r\n /** Append editor wrapper after initial textarea */\r\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\r\n\r\n /** Append block with notifications to the document */\r\n notifications = codex.draw.alertsHolder();\r\n codex.nodes.notifications = document.body.appendChild(notifications);\r\n\r\n /** Make toolbar and content-editable redactor */\r\n toolbar = codex.draw.toolbar();\r\n toolbarContent = codex.draw.toolbarContent();\r\n inlineToolbar = codex.draw.inlineToolbar();\r\n plusButton = codex.draw.plusButton();\r\n showSettingsButton = codex.draw.settingsButton();\r\n showCommentButton = codex.draw.commentButton();\r\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\r\n blockSettings = codex.draw.blockSettings();\r\n blockButtons = codex.draw.blockButtons();\r\n toolbox = codex.draw.toolbox();\r\n redactor = codex.draw.redactor();\r\n\r\n /** settings */\r\n var defaultSettings = codex.draw.defaultSettings(),\r\n pluginSettings = codex.draw.pluginsSettings();\r\n\r\n /** Add default and plugins settings */\r\n blockSettings.appendChild(pluginSettings);\r\n blockSettings.appendChild(defaultSettings);\r\n\r\n /** Make blocks buttons\r\n * This block contains settings button and remove block button\r\n */\r\n blockButtons.appendChild(showSettingsButton);\r\n blockButtons.appendChild(showTrashButton);\r\n blockButtons.appendChild(showCommentButton);\r\n blockButtons.appendChild(blockSettings);\r\n\r\n /** Append plus button */\r\n toolbarContent.appendChild(plusButton);\r\n\r\n /** Appending toolbar tools */\r\n toolbarContent.appendChild(toolbox);\r\n\r\n /** Appending first-level block buttons */\r\n toolbar.appendChild(blockButtons);\r\n\r\n /** Append toolbarContent to toolbar */\r\n toolbar.appendChild(toolbarContent);\r\n\r\n wrapper.appendChild(toolbar);\r\n\r\n wrapper.appendChild(redactor);\r\n\r\n /** Save created ui-elements to static nodes state */\r\n codex.nodes.wrapper = wrapper;\r\n codex.nodes.toolbar = toolbar;\r\n codex.nodes.plusButton = plusButton;\r\n codex.nodes.toolbox = toolbox;\r\n codex.nodes.blockSettings = blockSettings;\r\n codex.nodes.pluginSettings = pluginSettings;\r\n codex.nodes.defaultSettings = defaultSettings;\r\n codex.nodes.showSettingsButton = showSettingsButton;\r\n codex.nodes.showTrashButton = showTrashButton;\r\n codex.nodes.showCommentButton = showCommentButton;\r\n\r\n codex.nodes.redactor = redactor;\r\n\r\n codex.ui.makeInlineToolbar(inlineToolbar);\r\n\r\n /** fill in default settings */\r\n codex.toolbar.settings.addDefaultSettings();\r\n };\r\n\r\n ui.makeInlineToolbar = function(container) {\r\n\r\n /** Append to redactor new inline block */\r\n codex.nodes.inlineToolbar.wrapper = container;\r\n\r\n /** Draw toolbar buttons */\r\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\r\n\r\n /** Buttons action or settings */\r\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\r\n\r\n /** Append to inline toolbar buttons as part of it */\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\r\n\r\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\r\n };\r\n\r\n /**\r\n * @private\r\n * Append tools passed in codex.tools\r\n */\r\n ui.addTools = function () {\r\n\r\n var tool,\r\n tool_button;\r\n\r\n for(var name in codex.settings.tools) {\r\n tool = codex.settings.tools[name];\r\n codex.tools[name] = tool;;\r\n }\r\n\r\n /** Make toolbar buttons */\r\n for (var name in codex.tools){\r\n\r\n tool = codex.tools[name];\r\n\r\n if (!tool.displayInToolbox) {\r\n continue;\r\n }\r\n\r\n if (!tool.iconClassname) {\r\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n if (typeof tool.make != 'function') {\r\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n /**\r\n * if tools is for toolbox\r\n */\r\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\r\n\r\n codex.nodes.toolbox.appendChild(tool_button);\r\n\r\n /** Save tools to static nodes */\r\n codex.nodes.toolbarButtons[name] = tool_button;\r\n }\r\n\r\n\r\n /**\r\n * Add inline toolbar tools\r\n */\r\n codex.ui.addInlineToolbarTools();\r\n\r\n\r\n };\r\n\r\n ui.addInlineToolbarTools = function() {\r\n\r\n var tools = {\r\n\r\n bold: {\r\n icon : 'ce-icon-bold',\r\n command : 'bold'\r\n },\r\n\r\n italic: {\r\n icon : 'ce-icon-italic',\r\n command : 'italic'\r\n },\r\n\r\n underline: {\r\n icon : 'ce-icon-underline',\r\n command : 'underline'\r\n },\r\n\r\n link: {\r\n icon : 'ce-icon-link',\r\n command : 'createLink',\r\n }\r\n };\r\n\r\n var toolButton,\r\n tool;\r\n\r\n for(var name in tools) {\r\n\r\n tool = tools[name];\r\n\r\n toolButton = codex.draw.toolbarButtonInline(name, tool.icon);\r\n\r\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\r\n /**\r\n * Add callbacks to this buttons\r\n */\r\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n * Bind editor UI events\r\n */\r\n ui.bindEvents = function () {\r\n\r\n codex.core.log('ui.bindEvents fired', 'info');\r\n\r\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\r\n codex.notifications.errorThrown(errorMsg, event);\r\n }, false );\r\n\r\n /** All keydowns on Document */\r\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\r\n\r\n /** All keydowns on Document */\r\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\r\n\r\n /**\r\n * Mouse click to radactor\r\n */\r\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\r\n\r\n /**\r\n * Clicks to the Plus button\r\n */\r\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\r\n\r\n /**\r\n * Clicks to SETTINGS button in toolbar\r\n */\r\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\r\n\r\n /**\r\n * Clicks to COMMENT button in toolbar\r\n */\r\n codex.nodes.showCommentButton.addEventListener('click', codex.callback.showCommentButtonClicked, false );\r\n\r\n\r\n /**\r\n * @deprecated ( but now in use for syncronization );\r\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\r\n */\r\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\r\n\r\n /** Bind click listeners on toolbar buttons */\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Initialize plugins before using\r\n * Ex. Load scripts or call some internal methods\r\n */\r\n ui.preparePlugins = function() {\r\n\r\n for(var tool in codex.tools) {\r\n\r\n if (typeof codex.tools[tool].prepare != 'function')\r\n continue;\r\n\r\n codex.tools[tool].prepare();\r\n }\r\n },\r\n\r\n ui.addBlockHandlers = function(block) {\r\n\r\n if (!block) return;\r\n\r\n /**\r\n * Block keydowns\r\n */\r\n block.addEventListener('keydown', function(event) {\r\n codex.callback.blockKeydown(event, block);\r\n }, false);\r\n\r\n /**\r\n * Pasting content from another source\r\n */\r\n block.addEventListener('paste', function (event) {\r\n codex.callback.blockPaste(event);\r\n }, false);\r\n\r\n block.addEventListener('mouseup', function(){\r\n codex.toolbar.inline.show();\r\n }, false);\r\n\r\n };\r\n\r\n /** getting all contenteditable elements */\r\n ui.saveInputs = function() {\r\n\r\n var redactor = codex.nodes.redactor,\r\n elements = [];\r\n\r\n /** Save all inputs in global variable state */\r\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\r\n };\r\n\r\n /**\r\n * Adds first initial block on empty redactor\r\n */\r\n ui.addInitialBlock = function(){\r\n\r\n var initialBlockType = codex.settings.initialBlockPlugin,\r\n initialBlock;\r\n\r\n if ( !codex.tools[initialBlockType] ){\r\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\r\n return;\r\n }\r\n\r\n initialBlock = codex.tools[initialBlockType].render();\r\n\r\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\r\n\r\n codex.content.insertBlock({\r\n type : initialBlockType,\r\n block : initialBlock\r\n });\r\n\r\n codex.content.workingNodeChanged(initialBlock);\r\n\r\n };\r\n\r\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\r\n\r\n button.addEventListener('mousedown', function(event) {\r\n\r\n codex.toolbar.inline.toolClicked(event, type);\r\n\r\n }, false);\r\n };\r\n\r\n return ui;\r\n\r\n})({});\r\n\r\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\r\n *\r\n * Codex.Editor Transport Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0.0\r\n */\r\n\r\nvar transport = (function(transport){\r\n\r\n transport.input = null;\r\n\r\n /**\r\n * @property {Object} arguments - keep plugin settings and defined callbacks\r\n */\r\n transport.arguments = null;\r\n\r\n transport.prepare = function(){\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'file';\r\n input.addEventListener('change', codex.transport.fileSelected);\r\n\r\n codex.transport.input = input;\r\n\r\n };\r\n\r\n /** Clear input when files is uploaded */\r\n transport.clearInput = function() {\r\n\r\n /** Remove old input */\r\n this.input = null;\r\n\r\n /** Prepare new one */\r\n this.prepare();\r\n };\r\n\r\n /**\r\n * Callback for file selection\r\n */\r\n transport.fileSelected = function(event){\r\n\r\n var input = this,\r\n files = input.files,\r\n filesLength = files.length,\r\n formdData = new FormData(),\r\n file,\r\n i;\r\n\r\n formdData.append('files', files[0], files[0].name);\r\n\r\n codex.transport.ajax({\r\n data : formdData,\r\n beforeSend : codex.transport.arguments.beforeSend,\r\n success : codex.transport.arguments.success,\r\n error : codex.transport.arguments.error\r\n });\r\n };\r\n\r\n /**\r\n * Use plugin callbacks\r\n * @protected\r\n */\r\n transport.selectAndUpload = function (args) {\r\n\r\n this.arguments = args;\r\n this.input.click();\r\n\r\n };\r\n\r\n /**\r\n * Ajax requests module\r\n */\r\n transport.ajax = function(params){\r\n\r\n var xhr = new XMLHttpRequest(),\r\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\r\n success = typeof params.success == 'function' ? params.success : function(){},\r\n error = typeof params.error == 'function' ? params.error : function(){};\r\n\r\n beforeSend();\r\n\r\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\r\n\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\r\n xhr.onload = function () {\r\n if (xhr.status === 200) {\r\n success(xhr.responseText);\r\n } else {\r\n console.log(\"request error: %o\", xhr);\r\n error();\r\n }\r\n };\r\n\r\n xhr.send(params.data);\r\n this.clearInput();\r\n\r\n };\r\n\r\n return transport;\r\n\r\n})({});\r\n\r\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var renderer = (function(renderer) {\r\n\r\n /**\r\n * Asyncronously parses input JSON to redactor blocks\r\n */\r\n renderer.makeBlocksFromData = function () {\r\n\r\n /**\r\n * If redactor is empty, add first paragraph to start writing\r\n */\r\n if (!codex.state.blocks.items.length) {\r\n\r\n codex.ui.addInitialBlock();\r\n return;\r\n\r\n }\r\n\r\n Promise.resolve()\r\n\r\n /** First, get JSON from state */\r\n .then(function() {\r\n return codex.state.blocks;\r\n })\r\n\r\n /** Then, start to iterate they */\r\n .then(codex.renderer.appendBlocks)\r\n\r\n /** Write log if something goes wrong */\r\n .catch(function(error) {\r\n codex.core.log('Error while parsing JSON: %o', 'error', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Parses JSON to blocks\r\n * @param {object} data\r\n * @return Primise -> nodeList\r\n */\r\n renderer.appendBlocks = function (data) {\r\n\r\n var blocks = data.items;\r\n\r\n /**\r\n * Sequence of one-by-one blocks appending\r\n * Uses to save blocks order after async-handler\r\n */\r\n var nodeSequence = Promise.resolve();\r\n\r\n for (var index = 0; index < blocks.length ; index++ ) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Append node at specified index\r\n */\r\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\r\n\r\n /** We need to append node to sequence */\r\n nodeSequence\r\n\r\n /** first, get node async-aware */\r\n .then(function() {\r\n\r\n return codex.renderer.getNodeAsync(blocks , index);\r\n\r\n })\r\n\r\n /**\r\n * second, compose editor-block from JSON object\r\n */\r\n .then(codex.renderer.createBlockFromData)\r\n\r\n /**\r\n * now insert block to redactor\r\n */\r\n .then(function(blockData){\r\n\r\n /**\r\n * blockData has 'block', 'type' and 'stretched' information\r\n */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** Pass created block to next step */\r\n return blockData.block;\r\n\r\n })\r\n\r\n /** Log if something wrong with node */\r\n .catch(function(error) {\r\n codex.core.log('Node skipped while parsing because %o', 'error', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n renderer.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Creates editor block by JSON-data\r\n *\r\n * @uses render method of each plugin\r\n *\r\n * @param {object} blockData looks like\r\n * { header : {\r\n * text: '',\r\n * type: 'H3', ...\r\n * }\r\n * }\r\n * @return {object} with type and Element\r\n */\r\n renderer.createBlockFromData = function (blockData) {\r\n\r\n /** New parser */\r\n var pluginName = blockData.type,\r\n cover = blockData.cover;\r\n\r\n /** Get first key of object that stores plugin name */\r\n // for (var pluginName in blockData) break;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].render != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have «render» method`);\r\n }\r\n\r\n /** New Parser */\r\n var block = codex.tools[pluginName].render(blockData.data);\r\n\r\n /** is first-level block stretched */\r\n var stretched = codex.tools[pluginName].isStretched || false;\r\n\r\n /** Retrun type and block */\r\n return {\r\n type : pluginName,\r\n block : block,\r\n stretched : stretched,\r\n cover : cover\r\n };\r\n\r\n };\r\n\r\n return renderer;\r\n\r\n})({});\r\n\r\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var saver = (function(saver) {\r\n\r\n /**\r\n * Saves blocks\r\n * @private\r\n */\r\n saver.saveBlocks = function () {\r\n\r\n /** Save html content of redactor to memory */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n /** Empty jsonOutput state */\r\n codex.state.jsonOutput = [];\r\n\r\n Promise.resolve()\r\n\r\n .then(function() {\r\n return codex.nodes.redactor.childNodes;\r\n })\r\n /** Making a sequence from separate blocks */\r\n .then(codex.saver.makeQueue)\r\n\r\n .then(function() {\r\n // codex.nodes.textarea.innerHTML = codex.state.html;\r\n })\r\n\r\n .catch( function(error) {\r\n console.log('Something happend');\r\n });\r\n\r\n };\r\n\r\n saver.makeQueue = function(blocks) {\r\n\r\n var queue = Promise.resolve();\r\n\r\n for(var index = 0; index < blocks.length; index++) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.saver.getBlockData(queue, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /** Gets every block and makes From Data */\r\n saver.getBlockData = function(queue, blocks, index) {\r\n\r\n queue.then(function() {\r\n return codex.saver.getNodeAsync(blocks, index);\r\n })\r\n\r\n .then(codex.saver.makeFormDataFromBlocks);\r\n\r\n };\r\n\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n saver.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n saver.makeFormDataFromBlocks = function(block) {\r\n\r\n var pluginName = block.dataset.tool;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].save != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have save method`);\r\n }\r\n\r\n /** Result saver */\r\n var blockContent = block.childNodes[0],\r\n pluginsContent = blockContent.childNodes[0],\r\n savedData = codex.tools[pluginName].save(pluginsContent),\r\n output;\r\n\r\n\r\n output = {\r\n type: pluginName,\r\n data: savedData\r\n };\r\n\r\n /** Marks Blocks that will be in main page */\r\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.state.jsonOutput.push(output);\r\n };\r\n\r\n saver.saveComments = function() {\r\n\r\n var comments = codex.nodes.redactor.querySelectorAll('.ce-comment__wrapper');\r\n\r\n for (var i = 0; i < comments.length; i++) {\r\n\r\n var comment = {\r\n blockId: comments[i].dataset.blockId,\r\n text: comments[i].querySelector('.ce-comment__input').value\r\n };\r\n\r\n codex.state.comments.push(comment);\r\n }\r\n\r\n };\r\n\r\n return saver;\r\n\r\n})({});\r\n\r\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var content = (function(content) {\r\n\r\n content.currentNode = null;\r\n\r\n /**\r\n * Synchronizes redactor with original textarea\r\n */\r\n content.sync = function () {\r\n\r\n codex.core.log('syncing...');\r\n\r\n /**\r\n * Save redactor content to codex.state\r\n */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n };\r\n\r\n /**\r\n * @deprecated\r\n */\r\n content.getNodeFocused = function() {\r\n\r\n var selection = window.getSelection(),\r\n focused;\r\n\r\n if (selection.anchorNode === null) {\r\n return null;\r\n }\r\n\r\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\r\n focused = selection.anchorNode;\r\n } else {\r\n focused = selection.focusNode.parentElement;\r\n }\r\n\r\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\r\n\r\n /** Iterate with parent nodes to find first-level*/\r\n var parent = focused.parentNode;\r\n\r\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\r\n parent = parent.parentNode;\r\n }\r\n\r\n focused = parent;\r\n }\r\n\r\n if (focused != codex.nodes.redactor){\r\n return focused;\r\n }\r\n\r\n return null;\r\n\r\n };\r\n\r\n /**\r\n * Appends background to the block\r\n */\r\n content.markBlock = function() {\r\n\r\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n };\r\n\r\n /**\r\n * Clear background\r\n */\r\n content.clearMark = function() {\r\n\r\n if (codex.content.currentNode) {\r\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Finds first-level block\r\n * @param {Element} node - selected or clicked in redactors area node\r\n */\r\n content.getFirstLevelBlock = function(node) {\r\n\r\n if (!codex.core.isDomNode(node)) {\r\n node = node.parentNode;\r\n }\r\n\r\n if (node === codex.nodes.redactor || node === document.body) {\r\n\r\n return null;\r\n\r\n } else {\r\n\r\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n node = node.parentNode;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Trigger this event when working node changed\r\n * @param {Element} targetNode - first-level of this node will be current\r\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\r\n */\r\n content.workingNodeChanged = function (targetNode) {\r\n\r\n /** Clear background from previous marked block before we change */\r\n codex.content.clearMark();\r\n\r\n if (!targetNode) {\r\n return;\r\n }\r\n\r\n this.currentNode = this.getFirstLevelBlock(targetNode);\r\n\r\n };\r\n\r\n /**\r\n * Replaces one redactor block with another\r\n * @protected\r\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\r\n * @param {Element} newBlock\r\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\r\n *\r\n * [!] Function does not saves old block content.\r\n * You can get it manually and pass with newBlock.innerHTML\r\n */\r\n content.replaceBlock = function function_name(targetBlock, newBlock) {\r\n\r\n if (!targetBlock || !newBlock){\r\n codex.core.log('replaceBlock: missed params');\r\n return;\r\n }\r\n\r\n /** If target-block is not a frist-level block, then we iterate parents to find it */\r\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n targetBlock = targetBlock.parentNode;\r\n }\r\n\r\n /** Replacing */\r\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Add block handlers\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Inserts new block to redactor\r\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\r\n *\r\n * @param blockData {object}\r\n * @param blockData.block {Element} element with block content\r\n * @param blockData.type {string} block plugin\r\n * @param needPlaceCaret {bool} pass true to set caret in new block\r\n *\r\n */\r\n content.insertBlock = function( blockData, needPlaceCaret ) {\r\n\r\n var workingBlock = codex.content.currentNode,\r\n newBlockContent = blockData.block,\r\n blockType = blockData.type,\r\n cover = blockData.cover,\r\n isStretched = blockData.stretched;\r\n\r\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\r\n\r\n if (cover === true) {\r\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n }\r\n\r\n if (workingBlock) {\r\n\r\n codex.core.insertAfter(workingBlock, newBlock);\r\n\r\n } else {\r\n /**\r\n * If redactor is empty, append as first child\r\n */\r\n codex.nodes.redactor.appendChild(newBlock);\r\n\r\n }\r\n\r\n /**\r\n * Block handler\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n\r\n if ( needPlaceCaret ) {\r\n\r\n /**\r\n * If we don't know input index then we set default value -1\r\n */\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\r\n\r\n\r\n if (currentInputIndex == -1) {\r\n\r\n\r\n var editableElement = newBlock.querySelector('[contenteditable]'),\r\n emptyText = document.createTextNode('');\r\n\r\n editableElement.appendChild(emptyText);\r\n codex.caret.set(editableElement, 0, 0);\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.showPlusButton();\r\n\r\n\r\n } else {\r\n\r\n /** Timeout for browsers execution */\r\n setTimeout(function () {\r\n\r\n /** Setting to the new input */\r\n codex.caret.setToNextBlock(currentInputIndex);\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n }, 10);\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Replaces blocks with saving content\r\n * @protected\r\n * @param {Element} noteToReplace\r\n * @param {Element} newNode\r\n * @param {Element} blockType\r\n */\r\n content.switchBlock = function(blockToReplace, newBlock, tool){\r\n\r\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\r\n\r\n /** Replacing */\r\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\r\n\r\n /** Save new Inputs when block is changed */\r\n codex.ui.saveInputs();\r\n };\r\n\r\n /**\r\n * Iterates between child noted and looking for #text node on deepest level\r\n * @private\r\n * @param {Element} block - node where find\r\n * @param {int} postiton - starting postion\r\n * Example: childNodex.length to find from the end\r\n * or 0 to find from the start\r\n * @return {Text} block\r\n * @uses DFS\r\n */\r\n content.getDeepestTextNodeFromPosition = function (block, position) {\r\n\r\n /**\r\n * Clear Block from empty and useless spaces with trim.\r\n * Such nodes we should remove\r\n */\r\n var blockChilds = block.childNodes,\r\n index,\r\n node,\r\n text;\r\n\r\n for(index = 0; index < blockChilds.length; index++)\r\n {\r\n node = blockChilds[index];\r\n\r\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\r\n\r\n text = node.textContent.trim();\r\n\r\n /** Text is empty. We should remove this child from node before we start DFS\r\n * decrease the quantity of childs.\r\n */\r\n if (text === '') {\r\n\r\n block.removeChild(node);\r\n position--;\r\n }\r\n }\r\n }\r\n\r\n if (block.childNodes.length === 0) {\r\n return document.createTextNode('');\r\n }\r\n\r\n /** Setting default position when we deleted all empty nodes */\r\n if ( position < 0 )\r\n position = 1;\r\n\r\n var looking_from_start = false;\r\n\r\n /** For looking from START */\r\n if (position === 0) {\r\n looking_from_start = true;\r\n position = 1;\r\n }\r\n\r\n while ( position ) {\r\n\r\n /** initial verticle of node. */\r\n if ( looking_from_start ) {\r\n block = block.childNodes[0];\r\n } else {\r\n block = block.childNodes[position - 1];\r\n }\r\n\r\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\r\n\r\n position = block.childNodes.length;\r\n\r\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\r\n\r\n position = 0;\r\n }\r\n\r\n }\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n content.composeNewBlock = function (block, tool, isStretched) {\r\n\r\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\r\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\r\n\r\n blockContent.appendChild(block);\r\n newBlock.appendChild(blockContent);\r\n\r\n if (isStretched) {\r\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\r\n }\r\n\r\n newBlock.dataset.tool = tool;\r\n newBlock.dataset.id = +(new Date);\r\n return newBlock;\r\n };\r\n\r\n /**\r\n * Returns Range object of current selection\r\n */\r\n content.getRange = function() {\r\n\r\n var selection = window.getSelection().getRangeAt(0);\r\n\r\n return selection;\r\n };\r\n\r\n /**\r\n * Divides block in two blocks (after and before caret)\r\n * @private\r\n * @param {Int} inputIndex - target input index\r\n */\r\n content.splitBlock = function(inputIndex) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n anchorNodeText = anchorNode.textContent,\r\n caretOffset = selection.anchorOffset,\r\n textBeforeCaret,\r\n textNodeBeforeCaret,\r\n textAfterCaret,\r\n textNodeAfterCaret;\r\n\r\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\r\n\r\n\r\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\r\n textAfterCaret = anchorNodeText.substring(caretOffset);\r\n\r\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\r\n\r\n if (textAfterCaret) {\r\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\r\n }\r\n\r\n var previousChilds = [],\r\n nextChilds = [],\r\n reachedCurrent = false;\r\n\r\n if (textNodeAfterCaret) {\r\n nextChilds.push(textNodeAfterCaret);\r\n }\r\n\r\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\r\n\r\n if ( child != anchorNode ) {\r\n if ( !reachedCurrent ){\r\n previousChilds.push(child);\r\n } else {\r\n nextChilds.push(child);\r\n }\r\n } else {\r\n reachedCurrent = true;\r\n }\r\n\r\n }\r\n\r\n /** Clear current input */\r\n codex.state.inputs[inputIndex].innerHTML = '';\r\n\r\n /**\r\n * Append all childs founded before anchorNode\r\n */\r\n var previousChildsLength = previousChilds.length;\r\n\r\n for(i = 0; i < previousChildsLength; i++) {\r\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\r\n }\r\n\r\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\r\n\r\n /**\r\n * Append text node which is after caret\r\n */\r\n var nextChildsLength = nextChilds.length,\r\n newNode = document.createElement('div');\r\n\r\n for(i = 0; i < nextChildsLength; i++) {\r\n newNode.appendChild(nextChilds[i]);\r\n }\r\n\r\n newNode = newNode.innerHTML;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n /**\r\n * Make new paragraph with text after caret\r\n */\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render({\r\n text : newNode\r\n })\r\n }, true );\r\n\r\n };\r\n\r\n /**\r\n * Merges two blocks — current and target\r\n * If target index is not exist, then previous will be as target\r\n */\r\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\r\n\r\n /** If current input index is zero, then prevent method execution */\r\n if (currentInputIndex === 0) {\r\n return;\r\n }\r\n\r\n var targetInput,\r\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\r\n\r\n if (!targetInputIndex) {\r\n\r\n targetInput = codex.state.inputs[currentInputIndex - 1];\r\n\r\n } else {\r\n\r\n targetInput = codex.state.inputs[targetInputIndex];\r\n\r\n }\r\n\r\n targetInput.innerHTML += currentInputContent;\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Callback for HTML Mutations\r\n * @param {Array} mutation - Mutation Record\r\n */\r\n content.paste = function(mutation) {\r\n\r\n var workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool;\r\n\r\n if (codex.tools[tool].allowedToPaste) {\r\n codex.content.sanitize(mutation.addedNodes);\r\n } else {\r\n codex.content.pasteTextContent(mutation.addedNodes);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * gets only text/plain content of node\r\n * @param {Element} target - HTML node\r\n */\r\n content.pasteTextContent = function(nodes) {\r\n\r\n var node = nodes[0],\r\n textNode = document.createTextNode(node.textContent);\r\n\r\n if (codex.core.isDomNode(node)) {\r\n node.parentNode.replaceChild(textNode, node);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sanitizes HTML content\r\n * @param {Element} target - inserted element\r\n * @uses DFS function for deep searching\r\n */\r\n content.sanitize = function(target) {\r\n\r\n if (!target) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < target.childNodes.length; i++) {\r\n this.dfs(target.childNodes[i]);\r\n }\r\n };\r\n\r\n /**\r\n * Clears styles\r\n * @param {Element|Text}\r\n */\r\n content.clearStyles = function(target) {\r\n\r\n var href,\r\n newNode = null,\r\n blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'],\r\n allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'],\r\n needReplace = !allowedTags.includes(target.tagName),\r\n isDisplayedAsBlock = blockTags.includes(target.tagName);\r\n\r\n if (!codex.core.isDomNode(target)){\r\n return target;\r\n }\r\n\r\n if (!target.parentNode){\r\n return target;\r\n }\r\n\r\n if (needReplace) {\r\n\r\n if (isDisplayedAsBlock) {\r\n\r\n newNode = document.createElement('P');\r\n newNode.innerHTML = target.innerHTML;\r\n target.parentNode.replaceChild(newNode, target);\r\n target = newNode;\r\n\r\n } else {\r\n\r\n newNode = document.createTextNode(` ${target.textContent} `);\r\n newNode.textContent = newNode.textContent.replace(/\\s{2,}/g, ' ');\r\n target.parentNode.replaceChild(newNode, target);\r\n\r\n }\r\n }\r\n\r\n /** keep href attributes of tag A */\r\n if (target.tagName == 'A') {\r\n href = target.getAttribute('href');\r\n }\r\n\r\n /** Remove all tags */\r\n while(target.attributes.length > 0) {\r\n target.removeAttribute(target.attributes[0].name);\r\n }\r\n\r\n /** return href */\r\n if (href) {\r\n target.setAttribute('href', href);\r\n }\r\n\r\n return target;\r\n\r\n };\r\n\r\n /**\r\n * Depth-first search Algorithm\r\n * returns all childs\r\n * @param {Element}\r\n */\r\n content.dfs = function(el) {\r\n\r\n if (!codex.core.isDomNode(el))\r\n return;\r\n\r\n var sanitized = this.clearStyles(el);\r\n\r\n for(var i = 0; i < sanitized.childNodes.length; i++) {\r\n this.dfs(sanitized.childNodes[i]);\r\n }\r\n\r\n };\r\n\r\n return content;\r\n\r\n})({});\r\n\r\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var toolbar = (function(toolbar) {\r\n\r\n toolbar.init = function() {\r\n toolbar.settings = require('./settings');\r\n toolbar.inline = require('./inline');\r\n toolbar.toolbox = require('./toolbox');\r\n };\r\n\r\n /**\r\n * Margin between focused node and toolbar\r\n */\r\n toolbar.defaultToolbarHeight = 49;\r\n\r\n toolbar.defaultOffset = 34;\r\n\r\n toolbar.opened = false;\r\n\r\n toolbar.current = null;\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.open = function (){\r\n\r\n codex.nodes.toolbar.classList.add('opened');\r\n this.opened = true;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.close = function(){\r\n\r\n codex.nodes.toolbar.classList.remove('opened');\r\n\r\n toolbar.opened = false;\r\n toolbar.current = null;\r\n\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].classList.remove('selected');\r\n }\r\n\r\n /** Close toolbox when toolbar is not displayed */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n toolbar.toggle = function(){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open();\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n toolbar.hidePlusButton = function() {\r\n codex.nodes.plusButton.classList.add('hide');\r\n };\r\n\r\n toolbar.showPlusButton = function() {\r\n codex.nodes.plusButton.classList.remove('hide');\r\n };\r\n\r\n /**\r\n * Moving toolbar to the specified node\r\n */\r\n toolbar.move = function() {\r\n\r\n /** Close Toolbox when we move toolbar */\r\n codex.toolbar.toolbox.close();\r\n\r\n if (!codex.content.currentNode) {\r\n return;\r\n }\r\n\r\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\r\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\r\n\r\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\r\n\r\n /** Close trash actions */\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return toolbar;\r\n\r\n})({});\r\n\r\ntoolbar.init();\r\n\r\nmodule.exports = toolbar;\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\r\n\r\n settings.init = function() {\r\n require('../content');\r\n };\r\n\r\n settings.opened = false;\r\n\r\n settings.setting = null;\r\n settings.actions = null;\r\n\r\n settings.cover = null;\r\n\r\n /**\r\n * Append and open settings\r\n */\r\n settings.open = function(toolType){\r\n\r\n /**\r\n * Append settings content\r\n * It's stored in tool.settings\r\n */\r\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\r\n\r\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\r\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\r\n\r\n } else {\r\n\r\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\r\n\r\n }\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n /** Open settings block */\r\n codex.nodes.blockSettings.classList.add('opened');\r\n codex.toolbar.settings.addDefaultSettings();\r\n this.opened = true;\r\n };\r\n\r\n /**\r\n * Close and clear settings\r\n */\r\n settings.close = function(){\r\n\r\n codex.nodes.blockSettings.classList.remove('opened');\r\n codex.nodes.pluginSettings.innerHTML = '';\r\n\r\n this.opened = false;\r\n\r\n };\r\n\r\n /**\r\n * @param {string} toolType - plugin type\r\n */\r\n settings.toggle = function( toolType ){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open(toolType);\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This function adds default core settings\r\n */\r\n settings.addDefaultSettings = function() {\r\n\r\n /** list of default settings */\r\n var feedModeToggler;\r\n\r\n /** Clear block and append initialized settings */\r\n codex.nodes.defaultSettings.innerHTML = '';\r\n\r\n\r\n /** Init all default setting buttons */\r\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\r\n\r\n /**\r\n * Fill defaultSettings\r\n */\r\n\r\n /**\r\n * Button that enables/disables Feed-mode\r\n * Feed-mode means that block will be showed in articles-feed like cover\r\n */\r\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\r\n\r\n };\r\n\r\n /**\r\n * Cover setting.\r\n * This tune highlights block, so that it may be used for showing target block on main page\r\n * Draw different setting when block is marked for main page\r\n * If TRUE, then we show button that removes this selection\r\n * Also defined setting \"Click\" events will be listened and have separate callbacks\r\n *\r\n * @return {Element} node/button that we place in default settings block\r\n */\r\n settings.makeFeedModeToggler = function() {\r\n\r\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\r\n setting,\r\n data;\r\n\r\n if (!isFeedModeActivated) {\r\n\r\n data = {\r\n innerHTML : 'Вывести в ленте'\r\n };\r\n\r\n } else {\r\n\r\n data = {\r\n innerHTML : 'Не выводить в ленте'\r\n };\r\n\r\n }\r\n\r\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\r\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\r\n\r\n return setting;\r\n };\r\n\r\n /**\r\n * Updates Feed-mode\r\n */\r\n settings.updateFeedMode = function() {\r\n\r\n var currentNode = codex.content.currentNode;\r\n\r\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.toolbar.settings.close();\r\n };\r\n\r\n settings.isFeedModeActivated = function() {\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n if (currentBlock) {\r\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Here we will draw buttons and add listeners to components\r\n */\r\n settings.makeRemoveBlockButton = function() {\r\n\r\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\r\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\r\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\r\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\r\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\r\n\r\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\r\n\r\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\r\n\r\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\r\n\r\n actionWrapper.appendChild(confirmAction);\r\n actionWrapper.appendChild(cancelAction);\r\n\r\n removeBlockWrapper.appendChild(settingButton);\r\n removeBlockWrapper.appendChild(actionWrapper);\r\n\r\n /** Save setting */\r\n codex.toolbar.settings.setting = settingButton;\r\n codex.toolbar.settings.actions = actionWrapper;\r\n\r\n return removeBlockWrapper;\r\n\r\n };\r\n\r\n settings.removeButtonClicked = function() {\r\n\r\n var action = codex.toolbar.settings.actions;\r\n\r\n if (action.classList.contains('opened')) {\r\n codex.toolbar.settings.hideRemoveActions();\r\n } else {\r\n codex.toolbar.settings.showRemoveActions();\r\n }\r\n\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n settings.cancelRemovingRequest = function() {\r\n\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n settings.confirmRemovingRequest = function() {\r\n\r\n var currentBlock = codex.content.currentNode,\r\n firstLevelBlocksCount;\r\n\r\n currentBlock.remove();\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n }\r\n\r\n codex.ui.saveInputs();\r\n\r\n codex.toolbar.close();\r\n };\r\n\r\n settings.showRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.add('opened');\r\n };\r\n\r\n settings.hideRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n return settings;\r\n\r\n})({});\r\n\r\nsettings.init();\r\n\r\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","var inline = (function(inline) {\r\n\r\n inline.init = function() {\r\n\r\n };\r\n\r\n inline.buttonsOpened = null;\r\n inline.actionsOpened = null;\r\n inline.wrappersOffset = null;\r\n\r\n /**\r\n * saving selection that need for execCommand for styling\r\n *\r\n */\r\n inline.storedSelection = null,\r\n\r\n /**\r\n * @protected\r\n *\r\n * Open inline toobar\r\n */\r\n inline.show = function() {\r\n\r\n var selectedText = this.getSelectionText(),\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n buttons = codex.nodes.inlineToolbar.buttons;\r\n\r\n if (selectedText.length > 0) {\r\n\r\n /** Move toolbar and open */\r\n codex.toolbar.inline.move();\r\n\r\n /** Open inline toolbar */\r\n toolbar.classList.add('opened');\r\n\r\n /** show buttons of inline toolbar */\r\n codex.toolbar.inline.showButtons();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Closes inline toolbar\r\n */\r\n inline.close = function() {\r\n var toolbar = codex.nodes.inlineToolbar.wrapper;\r\n toolbar.classList.remove('opened');\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Moving toolbar\r\n */\r\n inline.move = function() {\r\n\r\n if (!this.wrappersOffset) {\r\n this.wrappersOffset = this.getWrappersOffset();\r\n }\r\n\r\n var coords = this.getSelectionCoords(),\r\n defaultOffset = 0,\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n newCoordinateX,\r\n newCoordinateY;\r\n\r\n if (toolbar.offsetHeight === 0) {\r\n defaultOffset = 40;\r\n }\r\n\r\n newCoordinateX = coords.x - this.wrappersOffset.left;\r\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\r\n\r\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\r\n\r\n /** Close everything */\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.closeAction();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Tool Clicked\r\n */\r\n\r\n inline.toolClicked = function(event, type) {\r\n\r\n /**\r\n * For simple tools we use default browser function\r\n * For more complicated tools, we should write our own behavior\r\n */\r\n switch (type) {\r\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\r\n default : codex.toolbar.inline.defaultToolAction(type); break;\r\n }\r\n\r\n /**\r\n * highlight buttons\r\n * after making some action\r\n */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saving wrappers offset in DOM\r\n */\r\n inline.getWrappersOffset = function() {\r\n\r\n var wrapper = codex.nodes.wrapper,\r\n offset = this.getOffset(wrapper);\r\n\r\n this.wrappersOffset = offset;\r\n return offset;\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates offset of DOM element\r\n *\r\n * @param el\r\n * @returns {{top: number, left: number}}\r\n */\r\n inline.getOffset = function ( el ) {\r\n\r\n var _x = 0;\r\n var _y = 0;\r\n\r\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\r\n _x += (el.offsetLeft + el.clientLeft);\r\n _y += (el.offsetTop + el.clientTop);\r\n el = el.offsetParent;\r\n }\r\n return { top: _y, left: _x };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates position of selected text\r\n * @returns {{x: number, y: number}}\r\n */\r\n inline.getSelectionCoords = function() {\r\n\r\n var sel = document.selection, range;\r\n var x = 0, y = 0;\r\n\r\n if (sel) {\r\n\r\n if (sel.type != \"Control\") {\r\n range = sel.createRange();\r\n range.collapse(true);\r\n x = range.boundingLeft;\r\n y = range.boundingTop;\r\n }\r\n\r\n } else if (window.getSelection) {\r\n\r\n sel = window.getSelection();\r\n\r\n if (sel.rangeCount) {\r\n\r\n range = sel.getRangeAt(0).cloneRange();\r\n if (range.getClientRects) {\r\n range.collapse(true);\r\n var rect = range.getClientRects()[0];\r\n x = rect.left;\r\n y = rect.top;\r\n }\r\n\r\n }\r\n }\r\n return { x: x, y: y };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Returns selected text as String\r\n * @returns {string}\r\n */\r\n inline.getSelectionText = function getSelectionText(){\r\n\r\n var selectedText = \"\";\r\n\r\n if (window.getSelection){ // all modern browsers and IE9+\r\n selectedText = window.getSelection().toString();\r\n }\r\n\r\n return selectedText;\r\n };\r\n\r\n /** Opens buttons block */\r\n inline.showButtons = function() {\r\n\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.add('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = true;\r\n\r\n /** highlight buttons */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n\r\n };\r\n\r\n /** Makes buttons disappear */\r\n inline.closeButtons = function() {\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.remove('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = false;\r\n };\r\n\r\n /** Open buttons defined action if exist */\r\n inline.showActions = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.classList.add('opened');\r\n\r\n codex.toolbar.inline.actionsOpened = true;\r\n };\r\n\r\n /** Close actions block */\r\n inline.closeAction = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.innerHTML = '';\r\n action.classList.remove('opened');\r\n codex.toolbar.inline.actionsOpened = false;\r\n };\r\n\r\n /** Action for link creation or for setting anchor */\r\n inline.createLinkAction = function(event, type) {\r\n\r\n var isActive = this.isLinkActive();\r\n\r\n var editable = codex.content.currentNode,\r\n storedSelection = codex.toolbar.inline.storedSelection;\r\n\r\n if (isActive) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode;\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * Changing stored selection. if we want to remove anchor from word\r\n * we should remove anchor from whole word, not only selected part.\r\n * The solution is than we get the length of current link\r\n * Change start position to - end of selection minus length of anchor\r\n */\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n\r\n codex.toolbar.inline.defaultToolAction('unlink');\r\n\r\n } else {\r\n\r\n /** Create input and close buttons */\r\n var action = codex.draw.inputForLink();\r\n codex.nodes.inlineToolbar.actions.appendChild(action);\r\n\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.showActions();\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * focus to input\r\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\r\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\r\n */\r\n action.focus();\r\n event.preventDefault();\r\n\r\n /** Callback to link action */\r\n action.addEventListener('keydown', function(event){\r\n\r\n if (event.keyCode == codex.core.keys.ENTER) {\r\n\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n codex.toolbar.inline.setAnchor(action.value);\r\n\r\n /**\r\n * Preventing events that will be able to happen\r\n */\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n codex.toolbar.inline.clearRange();\r\n }\r\n\r\n }, false);\r\n }\r\n };\r\n\r\n inline.isLinkActive = function() {\r\n\r\n var isActive = false;\r\n\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\r\n isActive = true;\r\n }\r\n });\r\n\r\n return isActive;\r\n };\r\n\r\n /** default action behavior of tool */\r\n inline.defaultToolAction = function(type) {\r\n document.execCommand(type, false, null);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets URL\r\n *\r\n * @param {String} url - URL\r\n */\r\n inline.setAnchor = function(url) {\r\n\r\n document.execCommand('createLink', false, url);\r\n\r\n /** Close after URL inserting */\r\n codex.toolbar.inline.closeAction();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saves selection\r\n */\r\n inline.saveSelection = function(containerEl) {\r\n\r\n var range = window.getSelection().getRangeAt(0),\r\n preSelectionRange = range.cloneRange(),\r\n start;\r\n\r\n preSelectionRange.selectNodeContents(containerEl);\r\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\r\n\r\n start = preSelectionRange.toString().length;\r\n\r\n return {\r\n start: start,\r\n end: start + range.toString().length\r\n };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets to previous selection (Range)\r\n *\r\n * @param {Element} containerEl - editable element where we restore range\r\n * @param {Object} savedSel - range basic information to restore\r\n */\r\n inline.restoreSelection = function(containerEl, savedSel) {\r\n\r\n var range = document.createRange(),\r\n charIndex = 0;\r\n\r\n range.setStart(containerEl, 0);\r\n range.collapse(true);\r\n\r\n var nodeStack = [containerEl],\r\n node,\r\n foundStart = false,\r\n stop = false,\r\n nextCharIndex;\r\n\r\n while (!stop && (node = nodeStack.pop())) {\r\n\r\n if (node.nodeType == 3) {\r\n\r\n nextCharIndex = charIndex + node.length;\r\n\r\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\r\n range.setStart(node, savedSel.start - charIndex);\r\n foundStart = true;\r\n }\r\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\r\n range.setEnd(node, savedSel.end - charIndex);\r\n stop = true;\r\n }\r\n charIndex = nextCharIndex;\r\n } else {\r\n var i = node.childNodes.length;\r\n while (i--) {\r\n nodeStack.push(node.childNodes[i]);\r\n }\r\n }\r\n }\r\n\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes all ranges from window selection\r\n */\r\n inline.clearRange = function() {\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * sets or removes hightlight\r\n */\r\n inline.hightlight = function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (document.queryCommandState(dataType)) {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n } else {\r\n codex.toolbar.inline.removeButtonsHighLight(tool);\r\n }\r\n\r\n /**\r\n *\r\n * hightlight for anchors\r\n */\r\n var selection = window.getSelection(),\r\n tag = selection.anchorNode.parentNode;\r\n\r\n if (tag.tagName == 'A' && dataType == 'link') {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Mark button if text is already executed\r\n */\r\n inline.setButtonHighlighted = function(button) {\r\n button.classList.add('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-link');\r\n icon.classList.add('ce-icon-unlink');\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes hightlight\r\n */\r\n inline.removeButtonsHighLight = function(button) {\r\n button.classList.remove('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-unlink');\r\n icon.classList.add('ce-icon-link');\r\n }\r\n };\r\n\r\n\r\n return inline;\r\n})({});\r\n\r\ninline.init();\r\n\r\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","var toolbox = (function(toolbox) {\r\n\r\n toolbox.init = function() {\r\n require('./toolbar');\r\n };\r\n\r\n toolbox.opened = false;\r\n\r\n /** Shows toolbox */\r\n toolbox.open = function() {\r\n\r\n /** Close setting if toolbox is opened */\r\n if (codex.toolbar.settings.opened) {\r\n codex.toolbar.settings.close();\r\n }\r\n\r\n /** display toolbox */\r\n codex.nodes.toolbox.classList.add('opened');\r\n\r\n /** Animate plus button */\r\n codex.nodes.plusButton.classList.add('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = true;\r\n\r\n };\r\n\r\n /** Closes toolbox */\r\n toolbox.close = function() {\r\n\r\n /** Makes toolbox disapear */\r\n codex.nodes.toolbox.classList.remove('opened');\r\n\r\n /** Rotate plus button */\r\n codex.nodes.plusButton.classList.remove('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = false;\r\n\r\n };\r\n\r\n toolbox.leaf = function(){\r\n\r\n var currentTool = codex.toolbar.current,\r\n tools = Object.keys(codex.tools),\r\n barButtons = codex.nodes.toolbarButtons,\r\n nextToolIndex,\r\n hiddenToolsAmount = 0,\r\n toolToSelect;\r\n\r\n /** Count toolbox hidden tools */\r\n for( var tool in codex.tools ) {\r\n if (!codex.tools[tool].displayInToolbox)\r\n hiddenToolsAmount ++;\r\n }\r\n\r\n if ( !currentTool ) {\r\n\r\n /** Get first tool from object*/\r\n for (toolToSelect in barButtons) break;\r\n\r\n } else {\r\n\r\n nextToolIndex = tools.indexOf(currentTool) + 1;\r\n\r\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\r\n\r\n if ( toolIsLastInToolbox ) {\r\n\r\n nextToolIndex = 0;\r\n\r\n /** getting first displayed tool */\r\n for( var tool in codex.tools ) {\r\n\r\n if (codex.tools[tool].displayInToolbox){\r\n break;\r\n }\r\n\r\n nextToolIndex ++;\r\n }\r\n\r\n }\r\n\r\n toolToSelect = tools[nextToolIndex];\r\n\r\n }\r\n\r\n for (var button in barButtons) barButtons[button].classList.remove('selected');\r\n barButtons[toolToSelect].classList.add('selected');\r\n codex.toolbar.current = toolToSelect;\r\n\r\n };\r\n\r\n /**\r\n * Transforming selected node type into selected toolbar element type\r\n * @param {event} event\r\n */\r\n toolbox.toolClicked = function() {\r\n\r\n /**\r\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\r\n */\r\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\r\n tool = codex.tools[codex.toolbar.current],\r\n workingNode = codex.content.currentNode,\r\n currentInputIndex = codex.caret.inputIndex,\r\n newBlockContent,\r\n appendCallback,\r\n blockData;\r\n\r\n /** Make block from plugin */\r\n newBlockContent = tool.make();\r\n\r\n /** information about block */\r\n blockData = {\r\n block : newBlockContent,\r\n type : tool.type,\r\n stretched : false\r\n };\r\n\r\n if (\r\n workingNode &&\r\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\r\n workingNode.textContent.trim() === ''\r\n ){\r\n /** Replace current block */\r\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\r\n\r\n } else {\r\n\r\n /** Insert new Block from plugin */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** increase input index */\r\n currentInputIndex++;\r\n\r\n }\r\n\r\n /** Fire tool append callback */\r\n appendCallback = tool.appendCallback;\r\n\r\n if (appendCallback && typeof appendCallback == 'function') {\r\n appendCallback.call(event);\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n /** Set caret to current block */\r\n codex.caret.setToBlock(currentInputIndex);\r\n\r\n }, 10);\r\n\r\n\r\n /**\r\n * Changing current Node\r\n */\r\n codex.content.workingNodeChanged();\r\n\r\n /**\r\n * Move toolbar when node is changed\r\n */\r\n codex.toolbar.move();\r\n };\r\n\r\n return toolbox;\r\n\r\n})({});\r\n\r\ntoolbox.init();\r\n\r\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","var tools = (function(tools) {\r\n\r\n return tools;\r\n\r\n})({});\r\n\r\nmodule.exports = tools;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var callbacks = (function(callbacks) {\r\n\r\n callbacks.redactorSyncTimeout = null;\r\n\r\n callbacks.globalKeydown = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\r\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\r\n default : codex.callback.defaultKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.globalKeyup = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.UP :\r\n case codex.core.keys.LEFT :\r\n case codex.core.keys.RIGHT :\r\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.tabKeyPressed = function(event){\r\n\r\n if ( !codex.toolbar.opened ) {\r\n codex.toolbar.open();\r\n }\r\n\r\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\r\n codex.toolbar.toolbox.open();\r\n } else {\r\n codex.toolbar.toolbox.leaf();\r\n }\r\n\r\n event.preventDefault();\r\n };\r\n\r\n /**\r\n * ENTER key handler\r\n * Makes new paragraph block\r\n */\r\n callbacks.enterKeyPressed = function(event){\r\n\r\n /** Set current node */\r\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\r\n\r\n if (firstLevelBlocksArea) {\r\n event.preventDefault();\r\n\r\n /**\r\n * it means that we lose input index, saved index before is not correct\r\n * therefore we need to set caret when we insert new block\r\n */\r\n codex.caret.inputIndex = -1;\r\n\r\n codex.callback.enterPressedOnBlock();\r\n return;\r\n }\r\n\r\n if (event.target.contentEditable == 'true') {\r\n\r\n /** Update input index */\r\n codex.caret.saveCurrentInputIndex();\r\n }\r\n\r\n if (!codex.content.currentNode) {\r\n /**\r\n * Enter key pressed in first-level block area\r\n */\r\n codex.callback.enterPressedOnBlock(event);\r\n return;\r\n }\r\n\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\r\n workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool,\r\n isEnterPressedOnToolbar = codex.toolbar.opened &&\r\n codex.toolbar.current &&\r\n event.target == codex.state.inputs[currentInputIndex];\r\n\r\n /** The list of tools which needs the default browser behaviour */\r\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n /**\r\n * When toolbar is opened, select tool instead of making new paragraph\r\n */\r\n if ( isEnterPressedOnToolbar ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n\r\n codex.toolbar.close();\r\n\r\n return;\r\n\r\n }\r\n\r\n /**\r\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\r\n */\r\n if ( event.shiftKey && !enableLineBreaks) {\r\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\r\n event.preventDefault();\r\n\r\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\r\n /** XOR */\r\n return;\r\n }\r\n\r\n var isLastTextNode = false,\r\n currentSelection = window.getSelection(),\r\n currentSelectedNode = currentSelection.anchorNode,\r\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\r\n isTextNodeHasParentBetweenContenteditable = false;\r\n\r\n /**\r\n * Workaround situation when caret at the Text node that has some wrapper Elements\r\n * Split block cant handle this.\r\n * We need to save default behavior\r\n */\r\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\r\n\r\n /**\r\n * Split blocks when input has several nodes and caret placed in textNode\r\n */\r\n if (\r\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\r\n !isTextNodeHasParentBetweenContenteditable &&\r\n !caretAtTheEndOfText\r\n ){\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('Splitting Text node...');\r\n\r\n codex.content.splitBlock(currentInputIndex);\r\n\r\n /** Show plus button when next input after split is empty*/\r\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\r\n codex.toolbar.showPlusButton();\r\n }\r\n\r\n } else {\r\n\r\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\r\n\r\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\r\n\r\n }\r\n\r\n if ( isLastTextNode && caretAtTheEndOfText ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n /** Show plus button with empty block */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n codex.core.log('Default ENTER behavior.');\r\n\r\n }\r\n\r\n }\r\n\r\n /** get all inputs after new appending block */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n callbacks.escapeKeyPressed = function(event){\r\n\r\n /** Close all toolbar */\r\n codex.toolbar.close();\r\n\r\n /** Close toolbox */\r\n codex.toolbar.toolbox.close();\r\n\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.arrowKeyPressed = function(event){\r\n\r\n codex.content.workingNodeChanged();\r\n\r\n /* Closing toolbar */\r\n codex.toolbar.close();\r\n codex.toolbar.move();\r\n\r\n };\r\n\r\n callbacks.defaultKeyPressed = function(event) {\r\n\r\n codex.toolbar.close();\r\n\r\n if (!codex.toolbar.inline.actionsOpened) {\r\n codex.toolbar.inline.close();\r\n codex.content.clearMark();\r\n }\r\n };\r\n\r\n callbacks.redactorClicked = function (event) {\r\n\r\n codex.content.workingNodeChanged(event.target);\r\n\r\n codex.ui.saveInputs();\r\n\r\n var selectedText = codex.toolbar.inline.getSelectionText();\r\n\r\n /**\r\n * If selection range took off, then we hide inline toolbar\r\n */\r\n if (selectedText.length === 0) {\r\n codex.toolbar.inline.close();\r\n }\r\n\r\n /** Update current input index in memory when caret focused into existed input */\r\n if (event.target.contentEditable == 'true') {\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }\r\n\r\n if (codex.content.currentNode === null) {\r\n\r\n /**\r\n * If inputs in redactor does not exits, then we put input index 0 not -1\r\n */\r\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\r\n\r\n /** If we have any inputs */\r\n if (codex.state.inputs.length) {\r\n\r\n /** getting firstlevel parent of input */\r\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\r\n }\r\n\r\n /** If input is empty, then we set caret to the last input */\r\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Create new input when caret clicked in redactors area */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n });\r\n\r\n /** If there is no inputs except inserted */\r\n if (codex.state.inputs.length === 1) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Set caret to this appended input */\r\n codex.caret.setToNextBlock(indexOfLastInput);\r\n }\r\n }\r\n\r\n /**\r\n * Move toolbar to the right position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n\r\n codex.toolbar.open();\r\n\r\n } else {\r\n\r\n /**\r\n * Move toolbar to the new position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n codex.toolbar.open();\r\n\r\n /** Close all panels */\r\n codex.toolbar.settings.close();\r\n codex.toolbar.toolbox.close();\r\n }\r\n\r\n\r\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\r\n\r\n if (inputIsEmpty) {\r\n\r\n /** Show plus button */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n /** Hide plus buttons */\r\n codex.toolbar.hidePlusButton();\r\n\r\n }\r\n\r\n var currentNodeType = codex.content.currentNode.dataset.tool;\r\n\r\n /** Mark current block*/\r\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\r\n\r\n codex.content.markBlock();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This method allows to define, is caret in contenteditable element or not.\r\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\r\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\r\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\r\n * specifies to the first-level block. Other cases we just ignore.\r\n */\r\n callbacks.clickedOnFirstLevelBlockArea = function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n flag = false;\r\n\r\n\r\n if (selection.rangeCount == 0) {\r\n\r\n return true;\r\n\r\n } else {\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n /** Already founded, without loop */\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n while (anchorNode.contentEditable != 'true') {\r\n anchorNode = anchorNode.parentNode;\r\n\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n if (anchorNode == document.body) {\r\n break;\r\n }\r\n }\r\n\r\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\r\n return flag ? false : true;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Toolbar button click handler\r\n * @param this - cursor to the button\r\n */\r\n callbacks.toolbarButtonClicked = function (event) {\r\n\r\n var button = this;\r\n\r\n codex.toolbar.current = button.dataset.type;\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n codex.toolbar.close();\r\n\r\n };\r\n\r\n callbacks.redactorInputEvent = function (event) {\r\n\r\n /**\r\n * Clear previous sync-timeout\r\n */\r\n if (this.redactorSyncTimeout){\r\n clearTimeout(this.redactorSyncTimeout);\r\n }\r\n\r\n /**\r\n * Start waiting to input finish and sync redactor\r\n */\r\n this.redactorSyncTimeout = setTimeout(function() {\r\n\r\n codex.content.sync();\r\n\r\n }, 500);\r\n\r\n };\r\n\r\n /** Show or Hide toolbox when plus button is clicked */\r\n callbacks.plusButtonClicked = function() {\r\n\r\n if (!codex.nodes.toolbox.classList.contains('opened')) {\r\n\r\n codex.toolbar.toolbox.open();\r\n\r\n } else {\r\n\r\n codex.toolbar.toolbox.close();\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Block handlers for KeyDown events\r\n */\r\n callbacks.blockKeydown = function(event, block) {\r\n\r\n switch (event.keyCode){\r\n\r\n case codex.core.keys.DOWN:\r\n case codex.core.keys.RIGHT:\r\n codex.callback.blockRightOrDownArrowPressed(block);\r\n break;\r\n\r\n case codex.core.keys.BACKSPACE:\r\n codex.callback.backspacePressed(block);\r\n break;\r\n\r\n case codex.core.keys.UP:\r\n case codex.core.keys.LEFT:\r\n codex.callback.blockLeftOrUpArrowPressed(block);\r\n break;\r\n\r\n }\r\n };\r\n\r\n /**\r\n * RIGHT or DOWN keydowns on block\r\n */\r\n callbacks.blockRightOrDownArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /** Looking for closest (parent) contentEditable element of focused node */\r\n while (focusedNode.contentEditable != 'true') {\r\n\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent)\r\n {\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n /**\r\n * Do nothing when caret doesn not reaches the end of last child\r\n */\r\n var caretInLastChild = false,\r\n caretAtTheEndOfText = false;\r\n\r\n var lastChild,\r\n deepestTextnode;\r\n\r\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\r\n\r\n if (codex.core.isDomNode(lastChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\r\n\r\n } else {\r\n\r\n deepestTextnode = lastChild;\r\n\r\n }\r\n\r\n caretInLastChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\r\n\r\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\r\n codex.core.log('arrow [down|right] : caret does not reached the end');\r\n return false;\r\n }\r\n\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n\r\n };\r\n\r\n /**\r\n * LEFT or UP keydowns on block\r\n */\r\n callbacks.blockLeftOrUpArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /**\r\n * LEFT or UP not at the beginning\r\n */\r\n if ( selection.anchorOffset !== 0) {\r\n return false;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Do nothing if caret is not at the beginning of first child\r\n */\r\n var caretInFirstChild = false,\r\n caretAtTheBeginning = false;\r\n\r\n var firstChild,\r\n deepestTextnode;\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent) {\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n firstChild = focusedNode.childNodes[0];\r\n\r\n if (codex.core.isDomNode(firstChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\r\n\r\n } else {\r\n\r\n deepestTextnode = firstChild;\r\n\r\n }\r\n\r\n caretInFirstChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheBeginning = selection.anchorOffset === 0;\r\n\r\n if ( caretInFirstChild && caretAtTheBeginning ) {\r\n\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Callback for enter key pressing in first-level block area\r\n */\r\n callbacks.enterPressedOnBlock = function (event) {\r\n\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n };\r\n\r\n callbacks.backspacePressed = function (block) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n range,\r\n selectionLength,\r\n firstLevelBlocksCount;\r\n\r\n if (block.textContent.trim()) {\r\n\r\n range = codex.content.getRange();\r\n selectionLength = range.endOffset - range.startOffset;\r\n\r\n\r\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\r\n\r\n codex.content.mergeBlocks(currentInputIndex);\r\n\r\n } else {\r\n\r\n return;\r\n\r\n }\r\n }\r\n\r\n if (!selectionLength) {\r\n block.remove();\r\n }\r\n\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n\r\n /** Updating inputs state after deleting last block */\r\n codex.ui.saveInputs();\r\n\r\n /** Set to current appended block */\r\n setTimeout(function () {\r\n\r\n codex.caret.setToPreviousBlock(1);\r\n\r\n }, 10);\r\n\r\n } else {\r\n\r\n if (codex.caret.inputIndex !== 0) {\r\n\r\n /** Target block is not first */\r\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\r\n\r\n } else {\r\n\r\n /** If we try to delete first block */\r\n codex.caret.setToNextBlock(codex.caret.inputIndex);\r\n\r\n }\r\n }\r\n\r\n codex.toolbar.move();\r\n\r\n if (!codex.toolbar.opened) {\r\n codex.toolbar.open();\r\n }\r\n\r\n /** Updating inputs state */\r\n codex.ui.saveInputs();\r\n\r\n /** Prevent default browser behaviour */\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n node = codex.state.inputs[currentInputIndex];\r\n\r\n setTimeout(function() {\r\n\r\n codex.content.sanitize(node);\r\n\r\n }, 10);\r\n\r\n };\r\n\r\n callbacks._blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex();\r\n\r\n /**\r\n * create an observer instance\r\n */\r\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\r\n\r\n /**\r\n * configuration of the observer:\r\n */\r\n var config = { attributes: true, childList: true, characterData: false };\r\n\r\n // pass in the target node, as well as the observer options\r\n observer.observe(codex.state.inputs[currentInputIndex], config);\r\n };\r\n\r\n /**\r\n * Sends all mutations to paste handler\r\n */\r\n callbacks.handlePasteEvents = function(mutations) {\r\n mutations.forEach(codex.content.paste);\r\n };\r\n\r\n /**\r\n * Clicks on block settings button\r\n */\r\n callbacks.showSettingsButtonClicked = function(){\r\n\r\n /**\r\n * Get type of current block\r\n * It uses to append settings from tool.settings property.\r\n * ...\r\n * Type is stored in data-type attribute on block\r\n */\r\n var currentToolType = codex.content.currentNode.dataset.tool;\r\n\r\n codex.toolbar.settings.toggle(currentToolType);\r\n\r\n /** Close toolbox when settings button is active */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n /**\r\n * Clicks on block comment button\r\n */\r\n callbacks.showCommentButtonClicked = function(){\r\n\r\n codex.comments.add(codex.content.currentNode);\r\n\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return callbacks;\r\n\r\n})({});\r\n\r\nmodule.exports = callbacks;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var draw = (function(draw) {\r\n\r\n /**\r\n * Base editor wrapper\r\n */\r\n draw.wrapper = function () {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className += 'codex-editor';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n /**\r\n * Content-editable holder\r\n */\r\n draw.redactor = function () {\r\n\r\n var redactor = document.createElement('div');\r\n\r\n redactor.className += 'ce-redactor';\r\n\r\n return redactor;\r\n\r\n };\r\n\r\n draw.ceBlock = function() {\r\n\r\n var block = document.createElement('DIV');\r\n\r\n block.className += 'ce_block';\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * Empty toolbar with toggler\r\n */\r\n draw.toolbar = function () {\r\n\r\n var bar = document.createElement('div');\r\n\r\n bar.className += 'ce-toolbar';\r\n\r\n return bar;\r\n };\r\n\r\n draw.toolbarContent = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n wrapper.classList.add('ce-toolbar__content');\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * Inline toolbar\r\n */\r\n draw.inlineToolbar = function() {\r\n\r\n var bar = document.createElement('DIV');\r\n\r\n bar.className += 'ce-toolbar-inline';\r\n\r\n return bar;\r\n\r\n };\r\n\r\n /**\r\n * Wrapper for inline toobar buttons\r\n */\r\n draw.inlineToolbarButtons = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__buttons';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * For some actions\r\n */\r\n draw.inlineToolbarActions = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__actions';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.inputForLink = function() {\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'input';\r\n input.className += 'inputForLink';\r\n input.placeholder = 'Type URL ...';\r\n input.setAttribute('form', 'defaultForm');\r\n\r\n input.setAttribute('autofocus', 'autofocus');\r\n\r\n return input;\r\n\r\n };\r\n\r\n /**\r\n * Block with notifications\r\n */\r\n draw.alertsHolder = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.classList.add('ce_notifications-block');\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * @todo Desc\r\n */\r\n draw.blockButtons = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.className += 'ce-toolbar__actions';\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * Block settings panel\r\n */\r\n draw.blockSettings = function () {\r\n\r\n var settings = document.createElement('div');\r\n\r\n settings.className += 'ce-settings';\r\n\r\n return settings;\r\n };\r\n\r\n draw.defaultSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_default');\r\n\r\n return div;\r\n },\r\n\r\n draw.pluginsSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_plugin');\r\n\r\n return div;\r\n\r\n };\r\n\r\n draw.plusButton = function() {\r\n\r\n var button = document.createElement('span');\r\n\r\n button.className = 'ce-toolbar__plus';\r\n // button.innerHTML = '';\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Settings button in toolbar\r\n */\r\n draw.settingsButton = function () {\r\n\r\n var toggler = document.createElement('span');\r\n\r\n toggler.className = 'ce-toolbar__settings-btn';\r\n\r\n /** Toggler button*/\r\n toggler.innerHTML = '';\r\n\r\n return toggler;\r\n };\r\n\r\n\r\n draw.commentButton = function() {\r\n var btn = draw.node('SPAN', 'ce-toolbar__comment-btn', {innerHTML: ''});\r\n\r\n return btn;\r\n };\r\n\r\n draw.commentInput = function() {\r\n var wrapper = draw.node('DIV', 'ce-comment__wrapper', {textContent: 'Ваш комментарий:'}),\r\n input = draw.node('TEXTAREA', 'ce-comment__input');\r\n\r\n wrapper.appendChild(input);\r\n\r\n return wrapper\r\n };\r\n\r\n /**\r\n * Redactor tools wrapper\r\n */\r\n\r\n draw.toolbox = function() {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className = 'ce-toolbar__tools';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tool buttons for toolbox\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n * @returns {Element}\r\n */\r\n draw.toolbarButton = function (type, classname) {\r\n\r\n var button = document.createElement(\"li\"),\r\n tool_icon = document.createElement(\"i\"),\r\n tool_title = document.createElement(\"span\");\r\n\r\n button.dataset.type = type;\r\n button.setAttribute('title', type);\r\n\r\n tool_icon.classList.add(classname);\r\n tool_title.classList.add('ce_toolbar_tools--title');\r\n\r\n\r\n button.appendChild(tool_icon);\r\n button.appendChild(tool_title);\r\n\r\n return button;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tools for inline toolbar\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n */\r\n draw.toolbarButtonInline = function(type, classname) {\r\n var button = document.createElement(\"BUTTON\"),\r\n tool_icon = document.createElement(\"I\");\r\n\r\n button.type = \"button\";\r\n button.dataset.type = type;\r\n tool_icon.classList.add(classname);\r\n\r\n button.appendChild(tool_icon);\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Redactor block\r\n */\r\n draw.block = function (tagName, content) {\r\n\r\n var node = document.createElement(tagName);\r\n\r\n node.innerHTML = content || '';\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Creates Node with passed tagName and className\r\n * @param {string} tagName\r\n * @param {string} className\r\n * @param {object} properties - allow to assign properties\r\n */\r\n draw.node = function( tagName , className , properties ){\r\n\r\n var el = document.createElement( tagName );\r\n\r\n if ( className ) el.className = className;\r\n\r\n if ( properties ) {\r\n\r\n for (var name in properties){\r\n el[name] = properties[name];\r\n }\r\n }\r\n\r\n return el;\r\n };\r\n\r\n draw.pluginsRender = function(type, content) {\r\n\r\n return {\r\n type : type,\r\n block : cEditor.tools[type].render({\r\n text : content\r\n })\r\n };\r\n };\r\n\r\n return draw;\r\n\r\n})({});\r\n\r\nmodule.exports = draw;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var caret = (function(caret) {\r\n\r\n /**\r\n * @var {int} InputIndex - editable element in DOM\r\n */\r\n caret.inputIndex = null;\r\n\r\n /**\r\n * @var {int} offset - caret position in a text node.\r\n */\r\n caret.offset = null;\r\n\r\n /**\r\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\r\n */\r\n caret.focusedNodeIndex = null;\r\n\r\n /**\r\n * Creates Document Range and sets caret to the element.\r\n * @protected\r\n * @uses caret.save — if you need to save caret position\r\n * @param {Element} el - Changed Node.\r\n */\r\n caret.set = function( el , index, offset) {\r\n\r\n offset = offset || this.offset || 0;\r\n index = index || this.focusedNodeIndex || 0;\r\n\r\n var childs = el.childNodes,\r\n nodeToSet;\r\n\r\n if ( childs.length === 0 ) {\r\n\r\n nodeToSet = el;\r\n\r\n } else {\r\n\r\n nodeToSet = childs[index];\r\n\r\n }\r\n\r\n /** If Element is INPUT */\r\n if (el.tagName == 'INPUT') {\r\n el.focus();\r\n return;\r\n }\r\n\r\n if (codex.core.isDomNode(nodeToSet)) {\r\n\r\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\r\n }\r\n\r\n var range = document.createRange(),\r\n selection = window.getSelection();\r\n\r\n setTimeout(function() {\r\n\r\n range.setStart(nodeToSet, offset);\r\n range.setEnd(nodeToSet, offset);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }, 20);\r\n };\r\n\r\n /**\r\n * @protected\r\n * Updates index of input and saves it in caret object\r\n */\r\n caret.saveCurrentInputIndex = function () {\r\n\r\n /** Index of Input that we paste sanitized content */\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n if (!focusedNode){\r\n return;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n this.inputIndex = editableElementIndex;\r\n };\r\n\r\n /**\r\n * Returns current input index (caret object)\r\n */\r\n caret.getCurrentInputIndex = function() {\r\n return this.inputIndex;\r\n };\r\n\r\n /**\r\n * @param {int} index - index of first-level block after that we set caret into next input\r\n */\r\n caret.setToNextBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n nextInput = inputs[index + 1];\r\n\r\n if (!nextInput) {\r\n codex.core.log('We are reached the end');\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!nextInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n nextInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index + 1;\r\n codex.caret.set(nextInput, 0, 0);\r\n codex.content.workingNodeChanged(nextInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of target input.\r\n * Sets caret to input with this index\r\n */\r\n caret.setToBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n targetInput = inputs[index];\r\n\r\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\r\n\r\n if ( !targetInput ) {\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!targetInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n targetInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index;\r\n codex.caret.set(targetInput, 0, 0);\r\n codex.content.workingNodeChanged(targetInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of input\r\n */\r\n caret.setToPreviousBlock = function(index) {\r\n\r\n index = index || 0;\r\n\r\n var inputs = codex.state.inputs,\r\n previousInput = inputs[index - 1],\r\n lastChildNode,\r\n lengthOfLastChildNode,\r\n emptyTextElement;\r\n\r\n\r\n if (!previousInput) {\r\n codex.core.log('We are reached first node');\r\n return;\r\n }\r\n\r\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\r\n lengthOfLastChildNode = lastChildNode.length;\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!previousInput.childNodes.length) {\r\n\r\n emptyTextElement = document.createTextNode('');\r\n previousInput.appendChild(emptyTextElement);\r\n }\r\n codex.caret.inputIndex = index - 1;\r\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\r\n codex.content.workingNodeChanged(inputs[index - 1]);\r\n };\r\n\r\n caret.position = {\r\n\r\n atStart : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode,\r\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\r\n pluginsRender = firstLevelBlock.childNodes[0];\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\r\n isOffsetZero = anchorOffset === 0;\r\n\r\n return isFirstNode && isOffsetZero;\r\n\r\n },\r\n\r\n atTheEnd : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode;\r\n\r\n /** Caret is at the end of input */\r\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\r\n }\r\n };\r\n\r\n return caret;\r\n\r\n})({});\r\n\r\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var notifications = (function(notifications) {\r\n\r\n /**\r\n * Error notificator. Shows block with message\r\n * @protected\r\n */\r\n notifications.errorThrown = function(errorMsg, event) {\r\n\r\n codex.notifications.send('This action is not available currently', event.type, false);\r\n\r\n };\r\n\r\n /**\r\n * Appends notification with different types\r\n * @param message {string} - Error or alert message\r\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\r\n * @param append {boolean} - can be True or False when notification should be inserted after\r\n */\r\n notifications.send = function(message, type, append) {\r\n\r\n var notification = codex.draw.block('div');\r\n\r\n notification.textContent = message;\r\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\r\n\r\n if (!append) {\r\n codex.nodes.notifications.innerHTML = '';\r\n }\r\n\r\n codex.nodes.notifications.appendChild(notification);\r\n\r\n setTimeout(function () {\r\n notification.remove();\r\n }, 3000);\r\n\r\n };\r\n\r\n return notifications;\r\n\r\n})({});\r\n\r\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var parser = (function(parser) {\r\n\r\n /**\r\n * Splits content by `\\n` and returns blocks\r\n */\r\n parser.getSeparatedTextFromContent = function(content) {\r\n return content.split('\\n');\r\n };\r\n\r\n /** inserting text */\r\n parser.insertPastedContent = function(content) {\r\n\r\n var blocks = this.getSeparatedTextFromContent(content),\r\n i,\r\n inputIndex = cEditor.caret.getCurrentInputIndex(),\r\n textNode,\r\n parsedTextContent;\r\n\r\n for(i = 0; i < blocks.length; i++) {\r\n\r\n blocks[i].trim();\r\n\r\n if (blocks[i]) {\r\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\r\n cEditor.content.insertBlock(data);\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously parses textarea input string to HTML editor blocks\r\n */\r\n parser.parseTextareaContent = function () {\r\n\r\n var initialContent = cEditor.nodes.textarea.value;\r\n\r\n if ( initialContent.trim().length === 0 ) return true;\r\n\r\n\r\n cEditor.parser\r\n\r\n /** Get child nodes async-aware */\r\n .getNodesFromString(initialContent)\r\n\r\n /** Then append nodes to the redactor */\r\n .then(cEditor.parser.appendNodesToRedactor)\r\n\r\n /** Write log if something goes wrong */\r\n .catch(function(error) {\r\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Parses string to nodeList\r\n * @param string inputString\r\n * @return Primise -> nodeList\r\n */\r\n parser.getNodesFromString = function (inputString) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n var contentHolder = document.createElement('div');\r\n\r\n contentHolder.innerHTML = inputString;\r\n\r\n /**\r\n * Returning childNodes will include:\r\n * - Elements (html-tags),\r\n * - Texts (empty-spaces or non-wrapped strings )\r\n * - Comments and other\r\n */\r\n return contentHolder.childNodes;\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Appends nodes to the redactor\r\n * @param nodeList nodes - list for nodes to append\r\n */\r\n parser.appendNodesToRedactor = function(nodes) {\r\n\r\n /**\r\n * Sequence of one-by-one nodes appending\r\n * Uses to save blocks order after async-handler\r\n */\r\n var nodeSequence = Promise.resolve();\r\n\r\n\r\n for (var index = 0; index < nodes.length ; index++ ) {\r\n\r\n /** Add node to sequence at specified index */\r\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Append node at specified index\r\n */\r\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\r\n\r\n /** We need to append node to sequence */\r\n nodeSequence\r\n\r\n /** first, get node async-aware */\r\n .then(function() {\r\n\r\n return cEditor.parser.getNodeAsync(nodes , index);\r\n\r\n })\r\n\r\n /**\r\n * second, compose editor-block from node\r\n * and append it to redactor\r\n */\r\n .then(function(node){\r\n\r\n var block = cEditor.parser.createBlockByDomNode(node);\r\n\r\n if ( cEditor.core.isDomNode(block) ) {\r\n\r\n block.contentEditable = \"true\";\r\n\r\n /** Mark node as redactor block*/\r\n block.classList.add('ce-block');\r\n\r\n /** Append block to the redactor */\r\n cEditor.nodes.redactor.appendChild(block);\r\n\r\n /** Save block to the cEditor.state array */\r\n cEditor.state.blocks.push(block);\r\n\r\n return block;\r\n\r\n }\r\n return null;\r\n })\r\n\r\n .then(cEditor.ui.addBlockHandlers)\r\n\r\n /** Log if something wrong with node */\r\n .catch(function(error) {\r\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously returns node from nodeList by index\r\n * @return Promise to node\r\n */\r\n parser.getNodeAsync = function (nodeList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return nodeList.item(index);\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Creates editor block by DOM node\r\n *\r\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\r\n * other wrapps with

-tag\r\n *\r\n * @param DOMnode node\r\n * @return First-level node (paragraph)\r\n */\r\n parser.createBlockByDomNode = function (node) {\r\n\r\n /** First level nodes already appears as blocks */\r\n if ( cEditor.parser.isFirstLevelBlock(node) ){\r\n\r\n /** Save plugin type in data-type */\r\n node = this.storeBlockType(node);\r\n\r\n return node;\r\n }\r\n\r\n /** Other nodes wraps into parent block (paragraph-tag) */\r\n var parentBlock,\r\n nodeContent = node.textContent.trim(),\r\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\r\n\r\n\r\n /** Skip empty textNodes with space-symbols */\r\n if (isPlainTextNode && !nodeContent.length) return null;\r\n\r\n /** Make

tag */\r\n parentBlock = cEditor.draw.block('P');\r\n\r\n if (isPlainTextNode){\r\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\r\n } else {\r\n parentBlock.appendChild(node);\r\n }\r\n\r\n /** Save plugin type in data-type */\r\n parentBlock = this.storeBlockType(parentBlock);\r\n\r\n return parentBlock;\r\n\r\n };\r\n\r\n /**\r\n * It's a crutch\r\n * - - - - - - -\r\n * We need block type stored as data-attr\r\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\r\n * Remove it after updating parser module for the block-oriented structure:\r\n * - each block must have stored type\r\n * @param {Element} node\r\n */\r\n parser.storeBlockType = function (node) {\r\n\r\n switch (node.tagName) {\r\n case 'P' : node.dataset.tool = 'paragraph'; break;\r\n case 'H1':\r\n case 'H2':\r\n case 'H3':\r\n case 'H4':\r\n case 'H5':\r\n case 'H6': node.dataset.tool = 'header'; break;\r\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\r\n case 'CODE': node.dataset.tool = 'code'; break;\r\n }\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Check DOM node for display style: separated block or child-view\r\n */\r\n parser.isFirstLevelBlock = function (node) {\r\n\r\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\r\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\r\n\r\n };\r\n\r\n return parser;\r\n\r\n})({});\r\n\r\nmodule.exports = parser;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","var comments = function(comments) {\r\n\r\n comments.add = function(node) {\r\n\r\n var id = node.dataset.id,\r\n commentInput = codex.draw.commentInput();\r\n\r\n commentInput.dataset.blockId = id;\r\n\r\n node.insertBefore(commentInput, node.firstChild);\r\n\r\n };\r\n\r\n return comments;\r\n\r\n}({});\r\n\r\nmodule.exports = comments;\n\n\n// WEBPACK FOOTER //\n// ./modules/comments.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 992983c8d5f440faae7c","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/comments.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","comments","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","commentsSide","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","comment","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","appendComments","makeComment","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","Date","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","saveComments","wrappers","text","querySelector","time","blockId","commentId","selectionStart","selectionEnd","textContent","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","dfs","clearStyles","href","blockTags","allowedTags","needReplace","includes","tagName","isDisplayedAsBlock","replace","getAttribute","attributes","removeAttribute","sanitized","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","addCommentAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","dispatchEvent","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","childList","characterData","observe","mutations","currentToolType","commentInputChanged","path","sendButton","commentSendButton","commentHovered","commentSelection","getCommentSelectionById","getCommentById","commentBlured","commentSendButtonClicked","commentDeleteButtonClicked","delete","commentEditButtonClicked","commentsField","edit","bar","placeholder","div","toggler","field","commentInput","commentDeleteButton","commentEditButton","commentTmstmp","edited","toLocaleDateString","month","day","hour","minute","hour12","commentText","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode","highlight","surroundContents","deleteButton","editButton","newWrapper","commentData","deleteBtn","editBtn","createCommentSelection","getBlockById"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;;;AAIA;;AAEA,KAAIA,SAAS,mBAAAC,CAAQ,CAAR,CAAb;AACAC,QAAOC,OAAP,GAAiBH,MAAjB,C;;;;;;;;ACPA;;;;;AAKA,KAAII,QAAS,UAASA,KAAT,EAAe;;AAExB,SAAIC,OAAO,SAAPA,IAAO,GAAW;;AAElBD,eAAME,IAAN,GAAsB,mBAAAL,CAAQ,CAAR,CAAtB;AACAG,eAAMG,EAAN,GAAsB,mBAAAN,CAAQ,CAAR,CAAtB;AACAG,eAAMI,SAAN,GAAsB,mBAAAP,CAAQ,CAAR,CAAtB;AACAG,eAAMK,QAAN,GAAsB,mBAAAR,CAAQ,CAAR,CAAtB;AACAG,eAAMM,KAAN,GAAsB,mBAAAT,CAAQ,CAAR,CAAtB;AACAG,eAAMO,OAAN,GAAsB,mBAAAV,CAAQ,CAAR,CAAtB;AACAG,eAAMQ,OAAN,GAAsB,mBAAAX,CAAQ,CAAR,CAAtB;AACAG,eAAMS,KAAN,GAAsB,mBAAAZ,CAAQ,EAAR,CAAtB;AACAG,eAAMU,QAAN,GAAsB,mBAAAb,CAAQ,EAAR,CAAtB;AACAG,eAAMW,IAAN,GAAsB,mBAAAd,CAAQ,EAAR,CAAtB;AACAG,eAAMY,KAAN,GAAsB,mBAAAf,CAAQ,EAAR,CAAtB;AACAG,eAAMa,aAAN,GAAsB,mBAAAhB,CAAQ,EAAR,CAAtB;AACAG,eAAMc,MAAN,GAAsB,mBAAAjB,CAAQ,EAAR,CAAtB;AACAG,eAAMe,QAAN,GAAsB,mBAAAlB,CAAQ,EAAR,CAAtB;AACH,MAhBD;;AAkBA;;;;;AAKAG,WAAMgB,QAAN,GAAiB;AACbP,gBAAY,CAAC,WAAD,EAAc,QAAd,EAAwB,SAAxB,EAAmC,MAAnC,EAA2C,OAA3C,EAAoD,MAApD,EAA4D,SAA5D,EAAuE,WAAvE,EAAoF,OAApF,CADC;AAEbQ,qBAAY,cAFC;AAGbC,0BAAiB,oBAHJ;;AAKb;AACAC,6BAAoB;AANP,MAAjB;;AASA;;;;;AAKAnB,WAAMoB,KAAN,GAAc;AACVC,mBAAoB,IADV;AAEVC,kBAAoB,IAFV;AAGVC,uBAAoB,IAHV;AAIVf,kBAAoB,IAJV;AAKVgB,wBAAoB;AAChBF,sBAAU,IADM;AAEhBG,sBAAU,IAFM;AAGhBC,sBAAU;AAHM,UALV;AAUVC,kBAAoB,IAVV;AAWVd,wBAAoB,IAXV;AAYVe,qBAAoB,IAZV;AAaVC,6BAAoB,IAbV;AAcVC,0BAAoB,IAdV;AAeVC,wBAAoB,IAfV;AAgBVC,yBAAoB,IAhBV;AAiBVC,0BAAoB,IAjBV;AAkBVC,yBAAoB,EAlBV,EAkBc;AACxBC,mBAAoB;AAnBV,MAAd;;AAsBA;;;;;AAKAnC,WAAMoC,KAAN,GAAc;AACVC,qBAAY,EADF;AAEVC,iBAAY,EAFF;AAGVC,iBAAY,EAHF;AAIVxB,mBAAY;AAJF,MAAd;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BAf,WAAMwC,KAAN,GAAc,UAAUC,YAAV,EAAwB;;AAElCxC;;AAEA,cAAKC,IAAL,CAAUwC,OAAV,CAAkBD,YAAlB;;AAEA;AAFA,UAGKE,IAHL,CAGU,KAAKxC,EAAL,CAAQyC,IAHlB,EAIKD,IAJL,CAIU,KAAKxC,EAAL,CAAQ0C,QAJlB,EAKKF,IALL,CAKU,KAAKxC,EAAL,CAAQ2C,UALlB,EAMKH,IANL,CAMU,KAAKxC,EAAL,CAAQ4C,cANlB,EAOKJ,IAPL,CAOU,KAAKvC,SAAL,CAAesC,OAPzB,EAQKC,IARL,CAQU,KAAKtC,QAAL,CAAc2C,kBARxB,EASKL,IATL,CASU,KAAKxC,EAAL,CAAQ8C,UATlB,EAUKC,KAVL,CAUW,UAAUC,KAAV,EAAiB;AACpBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,sCAAf,EAAuD,MAAvD,EAA+DD,KAA/D;AACH,UAZL;AAcH,MAlBD;;AAoBA,YAAOnD,KAAP;AAEH,EA9HW,CA8HT,EA9HS,CAAZ;;AAgIAF,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;;;ACrIA,KAAIE,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;;;;AAMAA,UAAKwC,OAAL,GAAe,UAAUD,YAAV,EAAwB;;AAEnC,gBAAO,IAAIY,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;;AAEzC,iBAAKd,YAAL,EAAmB;;AAEfzC,uBAAMgB,QAAN,CAAeP,KAAf,GAAuBgC,aAAahC,KAAb,IAAsBT,MAAMgB,QAAN,CAAeP,KAA5D;AAEH;;AAED,iBAAIgC,aAAae,IAAjB,EAAuB;AACnBxD,uBAAMoC,KAAN,CAAYE,MAAZ,GAAqBG,aAAae,IAAlC;AACH;;AAEDxD,mBAAMoB,KAAN,CAAYC,QAAZ,GAAuBoC,SAASC,cAAT,CAAwBjB,aAAaxB,UAAb,IAA2BjB,MAAMgB,QAAN,CAAeC,UAAlE,CAAvB;;AAEA,iBAAI,QAAOjB,MAAMoB,KAAN,CAAYC,QAAnB,MAAgCsC,SAAhC,IAA6C3D,MAAMoB,KAAN,CAAYC,QAAZ,KAAyB,IAA1E,EAAgF;AAC5EkC,wBAAOK,MAAM,mCAAmCnB,aAAaxB,UAAtD,CAAP;AACH,cAFD,MAEO;AACHqC;AACH;AAEJ,UApBM,CAAP;AAsBH,MAxBD;;AA0BA;;;;AAIApD,UAAKkD,GAAL,GAAW,UAAUS,GAAV,EAAeC,IAAf,EAAqBC,GAArB,EAA0B;;AAEjCD,gBAAOA,QAAQ,KAAf;;AAEA,aAAI,CAACC,GAAL,EAAU;AACNA,mBAAOF,OAAO,WAAd;AACAA,mBAAO,yBAAP;AACH,UAHD,MAGO;AACHA,mBAAO,0BAA0BA,GAAjC;AACH;;AAED,aAAG;AACC,iBAAK,aAAaG,MAAb,IAAuBC,QAASH,IAAT,CAA5B,EAA6C;AACzC,qBAAKC,GAAL,EAAWE,QAASH,IAAT,EAAiBD,GAAjB,EAAuBE,GAAvB,EAAX,KACKE,QAASH,IAAT,EAAiBD,GAAjB;AACR;AAEJ,UAND,CAMC,OAAMK,CAAN,EAAQ,CAAE;AAEd,MAnBD;;AAqBA;;;;;AAKAhE,UAAKiE,WAAL,GAAmB,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AAC1CD,gBAAOE,UAAP,CAAkBC,YAAlB,CAA+BF,OAA/B,EAAwCD,OAAOI,WAA/C;AACH,MAFD;;AAIA;;;;;AAKAtE,UAAKuE,SAAL,GAAiB;AACbC,cAAU,CADG;AAEbC,eAAU,CAFG;AAGbC,kBAAU;AAHG,MAAjB;;AAMA;;;;AAIA1E,UAAK2E,IAAL,GAAY,EAAEC,WAAW,CAAb,EAAgBC,KAAK,CAArB,EAAwBC,OAAO,EAA/B,EAAmCC,OAAO,EAA1C,EAA8CC,MAAM,EAApD,EAAwDC,KAAK,EAA7D,EAAiEC,KAAK,EAAtE,EAA0EC,OAAO,EAAjF,EAAqFC,MAAM,EAA3F,EAA+FC,IAAI,EAAnG,EAAuGC,MAAM,EAA7G,EAAiHC,OAAO,EAAxH,EAA4HC,QAAQ,EAApI,EAAwIC,MAAM,EAA9I,EAAZ;;AAEA;;;;;AAKAzF,UAAK0F,SAAL,GAAiB,UAAUC,EAAV,EAAc;AAC3B,gBAAOA,MAAM,QAAOA,EAAP,yCAAOA,EAAP,OAAc,QAApB,IAAgCA,GAAGC,QAAnC,IAA+CD,GAAGC,QAAH,IAAe,KAAKrB,SAAL,CAAeC,GAApF;AACH,MAFD;;AAIA;;;AAGAxE,UAAK6F,IAAL,GAAY,UAAUvC,IAAV,EAAgB;;AAExB,aAAI,CAACA,IAAD,IAAS,CAACA,KAAKwC,GAAnB,EAAuB;AACnB;AACH;;AAED,aAAIC,UAAmBjC,OAAOkC,cAAP,GAAwB,IAAIA,cAAJ,EAAxB,GAA+C,IAAIC,aAAJ,CAAkB,mBAAlB,CAAtE;AAAA,aACIC,mBAAmB,4BAAU,CAAE,CADnC;AAAA,aAEIC,SAAS,EAFb;AAAA,aAGIC,GAHJ;;AAKA9C,cAAK+C,KAAL,GAAuB,IAAvB;AACA/C,cAAKM,IAAL,GAAuBN,KAAKM,IAAL,IAAa,KAApC;AACAN,cAAKA,IAAL,GAAuBA,KAAKA,IAAL,IAAa,EAApC;AACAA,cAAK,cAAL,IAAuBA,KAAK,cAAL,KAAwB,iCAA/C;AACA4C,4BAAuB5C,KAAKgD,OAAL,IAAgBJ,gBAAvC;;AAEA,aAAI5C,KAAKM,IAAL,IAAa,KAAb,IAAsBN,KAAKA,IAA/B,EAAqC;;AAEjCA,kBAAKwC,GAAL,GAAW,KAAKS,IAAL,CAAUjD,KAAKwC,GAAf,IAAsBxC,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAA5C,GAAmDA,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAApF;AAEH,UAJD,MAIO;;AAEH,kBAAI8C,GAAJ,IAAW9C,KAAKA,IAAhB,EAAsB;AAClB6C,2BAAWC,MAAM,GAAN,GAAYI,mBAAmBlD,KAAKA,IAAL,CAAU8C,GAAV,CAAnB,CAAZ,GAAiD,GAA5D;AACH;AACJ;;AAED,aAAI9C,KAAKmD,eAAT,EAA0B;AACtBV,qBAAQU,eAAR,GAA0B,IAA1B;AACH;;AAED,aAAInD,KAAKoD,UAAL,IAAmB,OAAOpD,KAAKoD,UAAZ,IAA0B,UAAjD,EAA6D;AACzDpD,kBAAKoD,UAAL,CAAgBC,IAAhB;AACH;;AAEDZ,iBAAQa,IAAR,CAActD,KAAKM,IAAnB,EAAyBN,KAAKwC,GAA9B,EAAmCxC,KAAK+C,KAAxC;AACAN,iBAAQc,gBAAR,CAAyB,kBAAzB,EAA6C,gBAA7C;AACAd,iBAAQc,gBAAR,CAAyB,cAAzB,EAAyC,mCAAzC;;AAEAd,iBAAQe,kBAAR,GAA6B,YAAW;AACpC,iBAAIf,QAAQgB,UAAR,IAAsB,CAAtB,IAA2BhB,QAAQiB,MAAR,IAAkB,GAAjD,EAAsD;AAClDd,kCAAiBH,QAAQkB,YAAzB;AACH;AACJ,UAJD;;AAMAlB,iBAAQmB,IAAR,CAAaf,MAAb;AACH,MA/CD;;AAiDA;AACAnG,UAAKmH,YAAL,GAAoB,UAASC,UAAT,EAAqBC,YAArB,EAAmC;;AAEnD;AACA,aAAK,CAACA,YAAD,IAAkBA,gBAAgB9D,SAASC,cAAT,CAAwB,eAAe6D,YAAvC,CAAvC,EAA+F;AAC3FvH,mBAAME,IAAN,CAAWkD,GAAX,CAAe,+DAAf,EAAgF,MAAhF;AACA;AACH;;AAGD,aAAIoE,SAAW/D,SAASgE,aAAT,CAAuB,QAAvB,CAAf;AACAD,gBAAO1D,IAAP,GAAc,iBAAd;AACA0D,gBAAOE,GAAP,GAAaJ,UAAb;AACAE,gBAAOjB,KAAP,GAAe,IAAf;AACAiB,gBAAOG,KAAP,GAAe,IAAf;;AAEA,aAAIJ,YAAJ,EAAkB;AACdC,oBAAOI,EAAP,GAAY,eAAeL,YAA3B;AACH;;AAED9D,kBAASoE,IAAT,CAAcC,WAAd,CAA0BN,MAA1B;AACA,gBAAOA,MAAP;AACH,MArBD;;AAuBA,YAAOtH,IAAP;AAEH,EA5KU,CA4KR,EA5KQ,CAAX;;AA8KAJ,QAAOC,OAAP,GAAiBG,IAAjB,C;;;;;;;;AC9KA,KAAIC,KAAM,UAASA,EAAT,EAAY;;AAElB;;;AAGAA,YAAG4H,SAAH,GAAe;;AAEX;;;AAGAC,kCAAkB,UALP;;AAOP;;;AAGAC,gCAAgB,mBAVT;;AAYP;;;AAGAC,kCAAkB,qBAfX;;AAiBP;;;AAGAC,oCAAoB,mBApBb;;AAsBP;;;AAGAC,qCAAqB,qBAzBd;;AA2BP;;;AAGAC,gCAAgB;;AA9BT,UAAf;;AAkCA;;;;;AAKAlI,YAAGyC,IAAH,GAAU,YAAY;;AAElB,qBAAItB,OAAJ,EACId,OADJ,EAEI8H,cAFJ,EAGI9G,aAHJ,EAIID,YAJJ,EAKIY,QALJ,EAMIoG,OANJ,EAOI1H,aAPJ,EAQI2H,YARJ,EASIzG,aATJ,EAUIF,kBAVJ,EAWIC,eAXJ,EAYIH,OAZJ,EAaIC,UAbJ;;AAeA;AACAN,2BAAUtB,MAAMW,IAAN,CAAWW,OAAX,EAAV;;AAEA;AACAtB,uBAAME,IAAN,CAAWiE,WAAX,CAAuBnE,MAAMoB,KAAN,CAAYC,QAAnC,EAA6CC,OAA7C;;AAEA;AACAT,iCAAgBb,MAAMW,IAAN,CAAW8H,YAAX,EAAhB;AACAzI,uBAAMoB,KAAN,CAAYP,aAAZ,GAA4B4C,SAASiF,IAAT,CAAcZ,WAAd,CAA0BjH,aAA1B,CAA5B;;AAEA;AACAL,2BAAwBR,MAAMW,IAAN,CAAWH,OAAX,EAAxB;AACA8H,kCAAwBtI,MAAMW,IAAN,CAAW2H,cAAX,EAAxB;AACA9G,iCAAwBxB,MAAMW,IAAN,CAAWa,aAAX,EAAxB;AACAI,8BAAwB5B,MAAMW,IAAN,CAAWiB,UAAX,EAAxB;AACAC,sCAAwB7B,MAAMW,IAAN,CAAWgI,cAAX,EAAxB;AACA7G,mCAAwB9B,MAAMQ,OAAN,CAAcQ,QAAd,CAAuB4H,qBAAvB,EAAxB;AACA7G,iCAAwB/B,MAAMW,IAAN,CAAWoB,aAAX,EAAxB;AACAyG,gCAAwBxI,MAAMW,IAAN,CAAW6H,YAAX,EAAxB;AACA7G,2BAAwB3B,MAAMW,IAAN,CAAWgB,OAAX,EAAxB;AACAQ,4BAAwBnC,MAAMW,IAAN,CAAWwB,QAAX,EAAxB;AACAZ,gCAAwBvB,MAAMW,IAAN,CAAWY,YAAX,EAAxB;;AAEA;AACA,qBAAIU,kBAAkBjC,MAAMW,IAAN,CAAWsB,eAAX,EAAtB;AAAA,qBACID,iBAAkBhC,MAAMW,IAAN,CAAWkI,eAAX,EADtB;;AAGA;AACA9G,+BAAc+F,WAAd,CAA0B9F,cAA1B;AACAD,+BAAc+F,WAAd,CAA0B7F,eAA1B;;AAEA;;;AAGAuG,8BAAaV,WAAb,CAAyBjG,kBAAzB;AACA2G,8BAAaV,WAAb,CAAyBhG,eAAzB;AACA0G,8BAAaV,WAAb,CAAyB/F,aAAzB;;AAEA;AACAuG,gCAAeR,WAAf,CAA2BlG,UAA3B;;AAEA;AACA0G,gCAAeR,WAAf,CAA2BnG,OAA3B;;AAEA;AACAnB,yBAAQsH,WAAR,CAAoBU,YAApB;;AAEA;AACAhI,yBAAQsH,WAAR,CAAoBQ,cAApB;;AAEAhH,yBAAQwG,WAAR,CAAoBvG,YAApB;;AAEAD,yBAAQwG,WAAR,CAAoBtH,OAApB;;AAEAc,yBAAQwG,WAAR,CAAoB3F,QAApB;;AAEA;AACAnC,uBAAMoB,KAAN,CAAYE,OAAZ,GAAiCA,OAAjC;AACAtB,uBAAMoB,KAAN,CAAYG,YAAZ,GAAiCA,YAAjC;AACAvB,uBAAMoB,KAAN,CAAYZ,OAAZ,GAAiCA,OAAjC;AACAR,uBAAMoB,KAAN,CAAYQ,UAAZ,GAAiCA,UAAjC;AACA5B,uBAAMoB,KAAN,CAAYO,OAAZ,GAAiCA,OAAjC;AACA3B,uBAAMoB,KAAN,CAAYW,aAAZ,GAAiCA,aAAjC;AACA/B,uBAAMoB,KAAN,CAAYY,cAAZ,GAAiCA,cAAjC;AACAhC,uBAAMoB,KAAN,CAAYa,eAAZ,GAAiCA,eAAjC;AACAjC,uBAAMoB,KAAN,CAAYS,kBAAZ,GAAiCA,kBAAjC;AACA7B,uBAAMoB,KAAN,CAAYU,eAAZ,GAAiCA,eAAjC;;AAEA9B,uBAAMoB,KAAN,CAAYe,QAAZ,GAAuBA,QAAvB;;AAEAnC,uBAAMG,EAAN,CAAS2I,iBAAT,CAA2BtH,aAA3B;;AAEA;AACAxB,uBAAMQ,OAAN,CAAcQ,QAAd,CAAuB+H,kBAAvB;AACH,UA3FD;;AA6FA5I,YAAG2I,iBAAH,GAAuB,UAASE,SAAT,EAAoB;;AAEvC;AACAhJ,uBAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,GAAoC0H,SAApC;;AAEA;AACAhJ,uBAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,GAAoCzB,MAAMW,IAAN,CAAWsI,oBAAX,EAApC;;AAEA;AACAjJ,uBAAMoB,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,GAAoC1B,MAAMW,IAAN,CAAWuI,oBAAX,EAApC;;AAEA;AACAlJ,uBAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkCwG,WAAlC,CAA8C9H,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAAxE;AACAzB,uBAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkCwG,WAAlC,CAA8C9H,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BE,OAAxE;;AAEA1B,uBAAMoB,KAAN,CAAYE,OAAZ,CAAoBwG,WAApB,CAAgC9H,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAA1D;AACH,UAhBD;;AAkBA;;;;AAIAnB,YAAG0C,QAAH,GAAc,YAAY;;AAEtB,qBAAIsG,IAAJ,EACIC,WADJ;;AAGA,sBAAI,IAAIC,IAAR,IAAgBrJ,MAAMgB,QAAN,CAAeP,KAA/B,EAAsC;AAClC0I,gCAAOnJ,MAAMgB,QAAN,CAAeP,KAAf,CAAqB4I,IAArB,CAAP;AACArJ,+BAAMS,KAAN,CAAY4I,IAAZ,IAAoBF,IAApB,CAAyB;AAC5B;;AAED;AACA,sBAAK,IAAIE,IAAT,IAAiBrJ,MAAMS,KAAvB,EAA6B;;AAEzB0I,gCAAOnJ,MAAMS,KAAN,CAAY4I,IAAZ,CAAP;;AAEA,6BAAI,CAACF,KAAKG,gBAAV,EAA4B;AACxB;AACH;;AAED,6BAAI,CAACH,KAAKI,aAAV,EAAyB;AACrBvJ,uCAAME,IAAN,CAAWkD,GAAX,CAAe,gDAAf,EAAiE,MAAjE,EAAyEiG,IAAzE;AACA;AACH;;AAED,6BAAI,OAAOF,KAAKvG,IAAZ,IAAoB,UAAxB,EAAoC;AAChC5C,uCAAME,IAAN,CAAWkD,GAAX,CAAe,qCAAf,EAAsD,MAAtD,EAA8DiG,IAA9D;AACA;AACH;;AAED;;;AAGAD,uCAAcpJ,MAAMW,IAAN,CAAW6I,aAAX,CAAyBH,IAAzB,EAA+BF,KAAKI,aAApC,CAAd;;AAEAvJ,+BAAMoB,KAAN,CAAYO,OAAZ,CAAoBmG,WAApB,CAAgCsB,WAAhC;;AAEA;AACApJ,+BAAMoB,KAAN,CAAYc,cAAZ,CAA2BmH,IAA3B,IAAmCD,WAAnC;AACH;;AAGD;;;AAGApJ,uBAAMG,EAAN,CAASsJ,qBAAT;AAGH,UA/CD;;AAiDAtJ,YAAGsJ,qBAAH,GAA2B,YAAW;;AAElC,qBAAIhJ,QAAQ;;AAERiJ,+BAAM;AACFC,uCAAU,cADR;AAEFC,0CAAU;AAFR,0BAFE;;AAORC,iCAAQ;AACJF,uCAAU,gBADN;AAEJC,0CAAU;AAFN,0BAPA;;AAYRE,oCAAW;AACPH,uCAAU,mBADH;AAEPC,0CAAU;AAFH,0BAZH;;AAiBRG,+BAAM;AACFJ,uCAAU,cADR;AAEFC,0CAAU;AAFR,0BAjBE;;AAsBRI,kCAAS;AACLL,uCAAU,mBADL;AAELC,0CAAU;AAFL;AAtBD,kBAAZ;;AA4BA,qBAAIK,UAAJ,EACId,IADJ;;AAGA,sBAAI,IAAIE,IAAR,IAAgB5I,KAAhB,EAAuB;;AAEnB0I,gCAAO1I,MAAM4I,IAAN,CAAP;;AAEAY,sCAAajK,MAAMW,IAAN,CAAWuJ,mBAAX,CAA+Bb,IAA/B,EAAqCF,KAAKQ,IAA1C,CAAb;;AAEA3J,+BAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCqG,WAAlC,CAA8CmC,UAA9C;AACA;;;AAGAjK,+BAAMG,EAAN,CAASgK,+BAAT,CAAyCF,UAAzC,EAAqDd,KAAKS,OAA1D;AACH;AAEJ,UA9CD;;AAgDA;;;;AAIAzJ,YAAG2C,UAAH,GAAgB,YAAY;;AAExB9C,uBAAME,IAAN,CAAWkD,GAAX,CAAe,qBAAf,EAAsC,MAAtC;;AAEAY,wBAAOoG,gBAAP,CAAwB,OAAxB,EAAiC,UAAUC,QAAV,EAAoBrE,GAApB,EAAyBsE,UAAzB,EAAqC;AAClEtK,+BAAMa,aAAN,CAAoB0J,WAApB,CAAgCF,QAAhC,EAA0CG,KAA1C;AACH,kBAFD,EAEG,KAFH;;AAIA;AACAxK,uBAAMoB,KAAN,CAAYe,QAAZ,CAAqBiI,gBAArB,CAAsC,SAAtC,EAAiDpK,MAAMU,QAAN,CAAe+J,aAAhE,EAA+E,KAA/E;;AAEA;AACAhH,0BAAS2G,gBAAT,CAA0B,OAA1B,EAAmCpK,MAAMU,QAAN,CAAegK,WAAlD,EAA+D,KAA/D;;AAEA;;;AAGA1K,uBAAMoB,KAAN,CAAYe,QAAZ,CAAqBiI,gBAArB,CAAsC,OAAtC,EAA+CpK,MAAMU,QAAN,CAAeiK,eAA9D,EAA+E,KAA/E;;AAEA;;;AAGA3K,uBAAMoB,KAAN,CAAYQ,UAAZ,CAAuBwI,gBAAvB,CAAwC,OAAxC,EAAiDpK,MAAMU,QAAN,CAAekK,iBAAhE,EAAmF,KAAnF;;AAEA;;;AAGA5K,uBAAMoB,KAAN,CAAYS,kBAAZ,CAA+BuI,gBAA/B,CAAgD,OAAhD,EAAyDpK,MAAMU,QAAN,CAAemK,yBAAxE,EAAmG,KAAnG;;AAEA;;;;AAIA7K,uBAAMoB,KAAN,CAAYe,QAAZ,CAAqBiI,gBAArB,CAAsC,OAAtC,EAA+CpK,MAAMU,QAAN,CAAeoK,kBAA9D,EAAkF,KAAlF;;AAEA;AACA,sBAAK,IAAIC,MAAT,IAAmB/K,MAAMoB,KAAN,CAAYc,cAA/B,EAA8C;AAC1ClC,+BAAMoB,KAAN,CAAYc,cAAZ,CAA2B6I,MAA3B,EAAmCX,gBAAnC,CAAoD,OAApD,EAA6DpK,MAAMU,QAAN,CAAesK,oBAA5E,EAAkG,KAAlG;AACH;AAEJ,UAxCD;;AA0CA;;;;AAIA7K,YAAG4C,cAAH,GAAoB,YAAW;;AAE3B,sBAAI,IAAIoG,IAAR,IAAgBnJ,MAAMS,KAAtB,EAA6B;;AAEzB,6BAAI,OAAOT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBzG,OAAzB,IAAoC,UAAxC,EACI;;AAEJ1C,+BAAMS,KAAN,CAAY0I,IAAZ,EAAkBzG,OAAlB;AACH;AACJ,UATD,EAWAvC,GAAG8K,gBAAH,GAAsB,UAASC,KAAT,EAAgB;;AAElC,qBAAI,CAACA,KAAL,EAAY;;AAEZ;;;AAGAA,uBAAMd,gBAAN,CAAuB,SAAvB,EAAkC,UAASI,KAAT,EAAgB;AAC9CxK,+BAAMU,QAAN,CAAeyK,YAAf,CAA4BX,KAA5B,EAAmCU,KAAnC;AACH,kBAFD,EAEG,KAFH;;AAIA;;;AAGAA,uBAAMd,gBAAN,CAAuB,OAAvB,EAAgC,UAAUI,KAAV,EAAiB;AAC7CxK,+BAAMU,QAAN,CAAe0K,UAAf,CAA0BZ,KAA1B;AACH,kBAFD,EAEG,KAFH;;AAIAU,uBAAMd,gBAAN,CAAuB,SAAvB,EAAkC,YAAU;AACxCpK,+BAAMQ,OAAN,CAAc6K,MAAd,CAAqBC,IAArB;AACH,kBAFD,EAEG,KAFH;AAIH,UAjCD;;AAmCA;AACAnL,YAAG8C,UAAH,GAAgB,YAAW;;AAEvB,qBAAId,WAAWnC,MAAMoB,KAAN,CAAYe,QAA3B;AAAA,qBACIoJ,WAAW,EADf;;AAGA;AACAvL,uBAAMoC,KAAN,CAAYG,MAAZ,GAAqBJ,SAASqJ,gBAAT,CAA0B,0BAA1B,CAArB;AACH,UAPD;;AASA;;;AAGArL,YAAGsL,eAAH,GAAqB,YAAU;;AAE3B,qBAAIC,mBAAmB1L,MAAMgB,QAAN,CAAeG,kBAAtC;AAAA,qBACIwK,YADJ;;AAGA,qBAAK,CAAC3L,MAAMS,KAAN,CAAYiL,gBAAZ,CAAN,EAAqC;AACjC1L,+BAAME,IAAN,CAAWkD,GAAX,CAAe,mEAAf,EAAoF,MAApF,EAA4FsI,gBAA5F;AACA;AACH;;AAEDC,gCAAe3L,MAAMS,KAAN,CAAYiL,gBAAZ,EAA8BE,MAA9B,EAAf;;AAEAD,8BAAaE,YAAb,CAA0B,kBAA1B,EAA8C,qBAA9C;;AAEA7L,uBAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,+BAAQ4H,gBADc;AAEtBR,gCAAQS;AAFc,kBAA1B;;AAKA3L,uBAAMO,OAAN,CAAcwL,kBAAd,CAAiCJ,YAAjC;AAEH,UArBD;;AAuBAxL,YAAGgK,+BAAH,GAAqC,UAASY,MAAT,EAAiBjH,IAAjB,EAAuB;;AAExDiH,wBAAOX,gBAAP,CAAwB,WAAxB,EAAqC,UAASI,KAAT,EAAgB;;AAEjDxK,+BAAMQ,OAAN,CAAc6K,MAAd,CAAqBW,WAArB,CAAiCxB,KAAjC,EAAwC1G,IAAxC;AAEH,kBAJD,EAIG,KAJH;AAKH,UAPD;;AASA,gBAAO3D,EAAP;AAEH,EApYQ,CAoYN,EApYM,CAAT;;AAsYAL,QAAOC,OAAP,GAAiBI,EAAjB,C;;;;;;;;ACtYA;;;;;;;;AAQA,KAAIC,YAAa,UAASA,SAAT,EAAmB;;AAEhCA,eAAU6L,KAAV,GAAkB,IAAlB;;AAEA;;;AAGA7L,eAAU8L,SAAV,GAAsB,IAAtB;;AAEA9L,eAAUsC,OAAV,GAAoB,YAAU;;AAE1B,aAAIuJ,QAAQxI,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEAwE,eAAMnI,IAAN,GAAa,MAAb;AACAmI,eAAM7B,gBAAN,CAAuB,QAAvB,EAAiCpK,MAAMI,SAAN,CAAgB+L,YAAjD;;AAEAnM,eAAMI,SAAN,CAAgB6L,KAAhB,GAAwBA,KAAxB;AAEH,MATD;;AAWA;AACA7L,eAAUgM,UAAV,GAAuB,YAAW;;AAE9B;AACA,cAAKH,KAAL,GAAa,IAAb;;AAEA;AACA,cAAKvJ,OAAL;AACH,MAPD;;AASA;;;AAGAtC,eAAU+L,YAAV,GAAyB,UAAS3B,KAAT,EAAe;;AAEpC,aAAIyB,QAAc,IAAlB;AAAA,aACII,QAAcJ,MAAMI,KADxB;AAAA,aAEIC,cAAcD,MAAME,MAFxB;AAAA,aAGIC,YAAc,IAAIC,QAAJ,EAHlB;AAAA,aAIIC,IAJJ;AAAA,aAKIC,CALJ;;AAOAH,mBAAUI,MAAV,CAAiB,OAAjB,EAA0BP,MAAM,CAAN,CAA1B,EAAoCA,MAAM,CAAN,EAAShD,IAA7C;;AAEArJ,eAAMI,SAAN,CAAgB2F,IAAhB,CAAqB;AACjBvC,mBAAOgJ,SADU;AAEjB5F,yBAAa5G,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0BtF,UAFtB;AAGjBJ,sBAAaxG,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0B1F,OAHtB;AAIjBrD,oBAAanD,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0B/I;AAJtB,UAArB;AAMH,MAjBD;;AAmBA;;;;AAIA/C,eAAUyM,eAAV,GAA4B,UAAUC,IAAV,EAAgB;;AAExC,cAAKZ,SAAL,GAAiBY,IAAjB;AACA,cAAKb,KAAL,CAAWc,KAAX;AAEH,MALD;;AAOA;;;AAGA3M,eAAU2F,IAAV,GAAiB,UAASM,MAAT,EAAgB;;AAE7B,aAAI2G,MAAM,IAAI9G,cAAJ,EAAV;AAAA,aACIU,aAAa,OAAOP,OAAOO,UAAd,IAA4B,UAA5B,GAAyCP,OAAOO,UAAhD,GAA6D,YAAU,CAAE,CAD1F;AAAA,aAEIJ,UAAa,OAAOH,OAAOG,OAAd,IAA4B,UAA5B,GAAyCH,OAAOG,OAAhD,GAA0D,YAAU,CAAE,CAFvF;AAAA,aAGIrD,QAAa,OAAOkD,OAAOlD,KAAd,IAA4B,UAA5B,GAAyCkD,OAAOlD,KAAhD,GAA0D,YAAU,CAAE,CAHvF;;AAKAyD;;AAEAoG,aAAIlG,IAAJ,CAAS,MAAT,EAAiB9G,MAAMgB,QAAN,CAAeE,eAAhC,EAAiD,IAAjD;;AAEA8L,aAAIjG,gBAAJ,CAAqB,kBAArB,EAAyC,gBAAzC;;AAEAiG,aAAIC,MAAJ,GAAa,YAAY;AACrB,iBAAID,IAAI9F,MAAJ,KAAe,GAAnB,EAAwB;AACpBV,yBAAQwG,IAAI7F,YAAZ;AACH,cAFD,MAEO;AACHlD,yBAAQb,GAAR,CAAY,mBAAZ,EAAiC4J,GAAjC;AACA7J;AACH;AACJ,UAPD;;AASA6J,aAAI5F,IAAJ,CAASf,OAAO7C,IAAhB;AACA,cAAK4I,UAAL;AAEH,MAzBD;;AA2BA,YAAOhM,SAAP;AAEH,EA/Fe,CA+Fb,EA/Fa,CAAhB;;AAiGAN,QAAOC,OAAP,GAAkBK,SAAlB,C;;;;;;;;ACzGA,KAAIC,WAAY,UAASA,QAAT,EAAmB;;AAE/B;;;AAGAA,cAAS2C,kBAAT,GAA8B,YAAY;;AAEtC;;;AAGA,aAAI,CAAChD,MAAMoC,KAAN,CAAYE,MAAZ,CAAmB4K,KAAnB,CAAyBX,MAA9B,EAAsC;;AAElCvM,mBAAMG,EAAN,CAASsL,eAAT;AACA;AAEH;;AAEDpI,iBAAQC,OAAR;;AAEA;AAFA,UAGKX,IAHL,CAGU,YAAW;AACb,oBAAO3C,MAAMoC,KAAN,CAAYE,MAAnB;AACH,UALL;;AAOI;AAPJ,UAQKK,IARL,CAQU3C,MAAMK,QAAN,CAAe8M,YARzB;;AAUI;AAVJ,UAWKjK,KAXL,CAWW,UAASC,KAAT,EAAgB;AACnBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,8BAAf,EAA+C,OAA/C,EAAwDD,KAAxD;AACH,UAbL;AAeH,MA3BD;;AA6BA;;;;;AAKA9C,cAAS8M,YAAT,GAAwB,UAAU3J,IAAV,EAAgB;;AAEpC,aAAIlB,SAASkB,KAAK0J,KAAlB;;AAEA;;;;AAIA,aAAIE,eAAe/J,QAAQC,OAAR,EAAnB;;AAEA,cAAK,IAAI+J,QAAQ,CAAjB,EAAoBA,QAAQ/K,OAAOiK,MAAnC,EAA4Cc,OAA5C,EAAsD;;AAElD;AACArN,mBAAMK,QAAN,CAAeiN,iBAAf,CAAiCF,YAAjC,EAA+C9K,MAA/C,EAAuD+K,KAAvD;AAEH;AAEJ,MAjBD;;AAmBAhN,cAASkN,cAAT,GAA0B,YAAW;;AAEjC,aAAIxM,WAAWf,MAAMoC,KAAN,CAAYE,MAAZ,CAAmBvB,QAAlC;;AAEA,cAAK,IAAI4L,IAAI,CAAb,EAAgBA,IAAI5L,SAASwL,MAA7B,EAAqCI,GAArC,EAA0C;AACtC3M,mBAAMe,QAAN,CAAeyM,WAAf,CAA2BzM,SAAS4L,CAAT,CAA3B;AACH;AAEJ,MARD;;AAUA;;;AAGAtM,cAASiN,iBAAT,GAA6B,UAAUF,YAAV,EAAwB9K,MAAxB,EAAgC+K,KAAhC,EAAuC;;AAEhE;AACAD;;AAEA;AAFA,UAGKzK,IAHL,CAGU,YAAW;;AAEb,oBAAO3C,MAAMK,QAAN,CAAeoN,YAAf,CAA4BnL,MAA5B,EAAqC+K,KAArC,CAAP;AAEH,UAPL;;AASI;;;AATJ,UAYK1K,IAZL,CAYU3C,MAAMK,QAAN,CAAeqN,mBAZzB;;AAcI;;;AAdJ,UAiBK/K,IAjBL,CAiBU,UAASgL,SAAT,EAAmB;;AAErB;;;AAGA3N,mBAAMO,OAAN,CAAcuL,WAAd,CAA0B6B,SAA1B;;AAEA;AACA,oBAAOA,UAAUzC,KAAjB;AAEH,UA3BL;;AA6BI;AA7BJ,UA8BKhI,KA9BL,CA8BW,UAASC,KAAT,EAAgB;AACnBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,uCAAf,EAAwD,OAAxD,EAAiED,KAAjE;AACH,UAhCL;;AAkCI,gBAAOiK,YAAP;AAEP,MAvCD;;AAyCA;;;;AAIA/M,cAASoN,YAAT,GAAwB,UAAUG,UAAV,EAAsBP,KAAtB,EAA6B;;AAEjD,gBAAOhK,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,oBAAOiL,WAAWP,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;;;;;AAaAhN,cAASqN,mBAAT,GAA+B,UAAUC,SAAV,EAAqB;;AAEhD;AACA,aAAIE,aAAaF,UAAU7J,IAA3B;AAAA,aACIgK,QAAaH,UAAUG,KAD3B;AAAA,aAEIlG,KAAa+F,UAAU/F,EAAV,IAAgB,CAAC,IAAImG,IAAJ,EAFlC;;AAIA;AACA;;AAEA;AACA,aAAI,CAAC/N,MAAMS,KAAN,CAAYoN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAO7N,MAAMS,KAAN,CAAYoN,UAAZ,EAAwBjC,MAA/B,IAAyC,UAA7C,EAAyD;;AAErD,mBAAMhI,sBAAiBiK,UAAjB,0CAAN;AACH;;AAED;AACA,aAAI3C,QAAQlL,MAAMS,KAAN,CAAYoN,UAAZ,EAAwBjC,MAAxB,CAA+B+B,UAAUnK,IAAzC,CAAZ;;AAEA;AACA,aAAIwK,YAAYhO,MAAMS,KAAN,CAAYoN,UAAZ,EAAwBI,WAAxB,IAAuC,KAAvD;;AAEA;AACA,gBAAO;AACHnK,mBAAY+J,UADT;AAEH3C,oBAAYA,KAFT;AAGH8C,wBAAYA,SAHT;AAIHF,oBAAYA,KAJT;AAKHlG,iBAAIA;AALD,UAAP;AAQH,MApCD;;AAsCA,YAAOvH,QAAP;AAEH,EAlLc,CAkLZ,EAlLY,CAAf;;AAoLAP,QAAOC,OAAP,GAAiBM,QAAjB,C;;;;;;;;ACpLA,KAAIC,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;;AAIAA,WAAM4N,UAAN,GAAmB,YAAY;;AAE3B;AACAlO,eAAMoC,KAAN,CAAY+L,IAAZ,GAAmBnO,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBiM,SAAxC;;AAEA;AACApO,eAAMoC,KAAN,CAAYC,UAAZ,GAAyB,EAAzB;;AAEAgB,iBAAQC,OAAR,GAEKX,IAFL,CAEU,YAAW;AACb,oBAAO3C,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBkM,UAA5B;AACH,UAJL;AAKI;AALJ,UAMK1L,IANL,CAMU3C,MAAMM,KAAN,CAAYgO,SANtB,EAQK3L,IARL,CAQU,YAAW;AACb;AACH,UAVL,EAYKO,KAZL,CAYY,UAASC,KAAT,EAAgB;AACpBc,qBAAQb,GAAR,CAAY,mBAAZ;AACH,UAdL;AAgBH,MAxBD;;AA0BA9C,WAAMgO,SAAN,GAAkB,UAAShM,MAAT,EAAiB;;AAE/B,aAAIiM,QAAQlL,QAAQC,OAAR,EAAZ;;AAEA,cAAI,IAAI+J,QAAQ,CAAhB,EAAmBA,QAAQ/K,OAAOiK,MAAlC,EAA0Cc,OAA1C,EAAmD;;AAE/C;AACArN,mBAAMM,KAAN,CAAYkO,YAAZ,CAAyBD,KAAzB,EAAgCjM,MAAhC,EAAwC+K,KAAxC;AAEH;AAEJ,MAXD;;AAaA;AACA/M,WAAMkO,YAAN,GAAqB,UAASD,KAAT,EAAgBjM,MAAhB,EAAwB+K,KAAxB,EAA+B;;AAEhDkB,eAAM5L,IAAN,CAAW,YAAW;AAClB,oBAAO3C,MAAMM,KAAN,CAAYmN,YAAZ,CAAyBnL,MAAzB,EAAiC+K,KAAjC,CAAP;AACH,UAFD,EAIK1K,IAJL,CAIU3C,MAAMM,KAAN,CAAYmO,sBAJtB;AAMH,MARD;;AAWA;;;;AAIAnO,WAAMmN,YAAN,GAAqB,UAAUG,UAAV,EAAsBP,KAAtB,EAA6B;;AAE9C,gBAAOhK,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,oBAAOiL,WAAWP,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA/M,WAAMmO,sBAAN,GAA+B,UAASvD,KAAT,EAAgB;;AAE3C,aAAI2C,aAAa3C,MAAMwD,OAAN,CAAcvF,IAA/B;;AAEA;AACA,aAAI,CAACnJ,MAAMS,KAAN,CAAYoN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAO7N,MAAMS,KAAN,CAAYoN,UAAZ,EAAwBc,IAA/B,IAAuC,UAA3C,EAAuD;;AAEnD,mBAAM/K,sBAAiBiK,UAAjB,gCAAN;AACH;;AAED;AACA,aAAIe,eAAiB1D,MAAMmD,UAAN,CAAiB,CAAjB,CAArB;AAAA,aACIQ,iBAAiBD,aAAaP,UAAb,CAAwB,CAAxB,CADrB;AAAA,aAEIS,YAAiB9O,MAAMS,KAAN,CAAYoN,UAAZ,EAAwBc,IAAxB,CAA6BE,cAA7B,CAFrB;AAAA,aAGIE,MAHJ;;AAKAA,kBAAS;AACLjL,mBAAM+J,UADD;AAELrK,mBAAMsL;AAFD,UAAT;;AAKA;AACAC,gBAAOjB,KAAP,GAAe5C,MAAM8D,SAAN,CAAgBC,QAAhB,CAAyBjP,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAA5C,CAAf;;AAEA2G,gBAAOnH,EAAP,GAAYsD,MAAMwD,OAAN,CAAc9G,EAA1B;;AAEA5H,eAAMoC,KAAN,CAAYC,UAAZ,CAAuB6M,IAAvB,CAA4BH,MAA5B;AACH,MAhCD;;AAkCAzO,WAAM6O,YAAN,GAAqB,YAAW;;AAE5B,aAAIpO,WAAW,EAAf;AAAA,aACIqO,WAAWpP,MAAMoB,KAAN,CAAYG,YAAZ,CAAyBiK,gBAAzB,CAA0C,sBAA1C,CADf;;AAGA,cAAK,IAAImB,IAAI,CAAb,EAAgBA,IAAIyC,SAAS7C,MAA7B,EAAqCI,GAArC,EAA0C;;AAEtC,iBAAI0C,OAAOD,SAASzC,CAAT,EAAY2C,aAAZ,CAA0B,mBAA1B,CAAX;AAAA,iBACIC,OAAOH,SAASzC,CAAT,EAAY2C,aAAZ,CAA0B,mBAA1B,CADX;AAAA,iBAEIE,UAAUJ,SAASzC,CAAT,EAAY+B,OAAZ,CAAoBc,OAFlC;AAAA,iBAGIC,YAAYL,SAASzC,CAAT,EAAY+B,OAAZ,CAAoBe,SAHpC;AAAA,iBAIIC,iBAAiBN,SAASzC,CAAT,EAAY+B,OAAZ,CAAoBgB,cAJzC;AAAA,iBAKIC,eAAeP,SAASzC,CAAT,EAAY+B,OAAZ,CAAoBiB,YALvC;;AAOA,iBAAIN,QAAQE,IAAZ,EAAkB;AACdxO,0BAASmO,IAAT,CAAc;AACVG,2BAAeA,KAAKO,WADV;AAEVL,2BAAeA,KAAKK,WAFV;AAGV,iCAAeJ,OAHL;AAIV,mCAAeC,SAJL;AAKV,wCAAmBC,cALT;AAMV,sCAAiBC;AANP,kBAAd;AAQH;AACJ;;AAGD3P,eAAMoC,KAAN,CAAYrB,QAAZ,GAAuBA,QAAvB;AAEH,MA7BD;;AA+BA,YAAOT,KAAP;AAEH,EAzIW,CAyIT,EAzIS,CAAZ;;AA2IAR,QAAOC,OAAP,GAAiBO,KAAjB,C;;;;;;;;AC3IA,KAAIC,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQsP,WAAR,GAAsB,IAAtB;;AAEA;;;AAGAtP,aAAQuP,IAAR,GAAe,YAAY;;AAEvB9P,eAAME,IAAN,CAAWkD,GAAX,CAAe,YAAf;;AAEA;;;AAGApD,eAAMoC,KAAN,CAAY+L,IAAZ,GAAmBnO,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBiM,SAAxC;AAEH,MATD;;AAWA;;;AAGA7N,aAAQwP,cAAR,GAAyB,YAAW;;AAEhC,aAAIC,YAAYhM,OAAOiM,YAAP,EAAhB;AAAA,aACIC,OADJ;;AAGA,aAAIF,UAAUG,UAAV,KAAyB,IAA7B,EAAmC;AAC/B,oBAAO,IAAP;AACH;;AAED,aAAKH,UAAUG,UAAV,CAAqBrK,QAArB,IAAiC9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBC,GAA3D,EAAiE;AAC7DwL,uBAAUF,UAAUG,UAApB;AACH,UAFD,MAEO;AACHD,uBAAUF,UAAUI,SAAV,CAAoBC,aAA9B;AACH;;AAED,aAAK,CAACrQ,MAAMc,MAAN,CAAawP,iBAAb,CAA+BJ,OAA/B,CAAN,EAAgD;;AAE5C;AACA,iBAAIK,SAASL,QAAQ5L,UAArB;;AAEA,oBAAOiM,UAAU,CAACvQ,MAAMc,MAAN,CAAawP,iBAAb,CAA+BC,MAA/B,CAAlB,EAAyD;AACrDA,0BAASA,OAAOjM,UAAhB;AACH;;AAED4L,uBAAUK,MAAV;AACH;;AAED,aAAIL,WAAWlQ,MAAMoB,KAAN,CAAYe,QAA3B,EAAoC;AAChC,oBAAO+N,OAAP;AACH;;AAED,gBAAO,IAAP;AAEH,MAjCD;;AAmCA;;;AAGA3P,aAAQiQ,SAAR,GAAoB,YAAW;;AAE3BxQ,eAAMO,OAAN,CAAcsP,WAAd,CAA0Bb,SAA1B,CAAoCyB,GAApC,CAAwCzQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBI,iBAA3D;AACH,MAHD;;AAKA;;;AAGA5H,aAAQmQ,SAAR,GAAoB,YAAW;;AAE3B,aAAI1Q,MAAMO,OAAN,CAAcsP,WAAlB,EAA+B;AAC3B7P,mBAAMO,OAAN,CAAcsP,WAAd,CAA0Bb,SAA1B,CAAoC2B,MAApC,CAA2C3Q,MAAMG,EAAN,CAAS4H,SAAT,CAAmBI,iBAA9D;AACH;AAEJ,MAND;;AAQA;;;;;;AAMA5H,aAAQqQ,kBAAR,GAA6B,UAASC,IAAT,EAAe;;AAExC,aAAI,CAAC7Q,MAAME,IAAN,CAAW0F,SAAX,CAAqBiL,IAArB,CAAL,EAAiC;AAC7BA,oBAAOA,KAAKvM,UAAZ;AACH;;AAED,aAAIuM,SAAS7Q,MAAMoB,KAAN,CAAYe,QAArB,IAAiC0O,SAASpN,SAASiF,IAAvD,EAA6D;;AAEzD,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,oBAAM,CAACmI,KAAK7B,SAAL,CAAeC,QAAf,CAAwBjP,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAA3C,CAAP,EAAoE;AAChE6I,wBAAOA,KAAKvM,UAAZ;AACH;;AAED,oBAAOuM,IAAP;AACH;AAEJ,MAnBD;;AAqBA;;;;;AAKAtQ,aAAQwL,kBAAR,GAA6B,UAAU+E,UAAV,EAAsB;;AAE/C;AACA9Q,eAAMO,OAAN,CAAcmQ,SAAd;;AAEA,aAAI,CAACI,UAAL,EAAiB;AACb;AACH;;AAED,cAAKjB,WAAL,GAAmB,KAAKe,kBAAL,CAAwBE,UAAxB,CAAnB;AAEH,MAXD;;AAaA;;;;;;;;;;AAUAvQ,aAAQwQ,YAAR,GAAuB,SAASC,aAAT,CAAuBC,WAAvB,EAAoCC,QAApC,EAA8C;;AAEjE,aAAI,CAACD,WAAD,IAAgB,CAACC,QAArB,EAA8B;AAC1BlR,mBAAME,IAAN,CAAWkD,GAAX,CAAe,6BAAf;AACA;AACH;;AAED;AACA,gBAAM,CAAC6N,YAAYjC,SAAZ,CAAsBC,QAAtB,CAA+BjP,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAAlD,CAAP,EAA2E;AACvEiJ,2BAAcA,YAAY3M,UAA1B;AACH;;AAED;AACAtE,eAAMoB,KAAN,CAAYe,QAAZ,CAAqBgP,YAArB,CAAkCD,QAAlC,EAA4CD,WAA5C;;AAEA;;;AAGAjR,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCmF,QAAjC;;AAEA;;;AAGAlR,eAAMG,EAAN,CAAS8K,gBAAT,CAA0BiG,QAA1B;;AAEA;;;AAGAlR,eAAMG,EAAN,CAAS8C,UAAT;AAEH,MA9BD;;AAgCA;;;;;;;;;;;;AAYA1C,aAAQuL,WAAR,GAAsB,UAAU6B,SAAV,EAAqByD,cAArB,EAAsC;;AAExD,aAAIC,eAAkBrR,MAAMO,OAAN,CAAcsP,WAApC;AAAA,aACIyB,kBAAkB3D,UAAUzC,KADhC;AAAA,aAEIqG,YAAkB5D,UAAU7J,IAFhC;AAAA,aAGI0L,UAAkB7B,UAAU/F,EAHhC;AAAA,aAIIkG,QAAkBH,UAAUG,KAJhC;AAAA,aAKIG,cAAkBN,UAAUK,SALhC;;AAOA,aAAIkD,WAAWlR,MAAMO,OAAN,CAAciR,eAAd,CAA8BF,eAA9B,EAA+CC,SAA/C,EAA0DtD,WAA1D,EAAuEuB,OAAvE,CAAf;;AAEA,aAAI1B,UAAU,IAAd,EAAoB;AAChBoD,sBAASlC,SAAT,CAAmByB,GAAnB,CAAuBzQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAA1C;AACH;;AAED,aAAIiJ,YAAJ,EAAkB;;AAEdrR,mBAAME,IAAN,CAAWiE,WAAX,CAAuBkN,YAAvB,EAAqCH,QAArC;AAEH,UAJD,MAIO;AACH;;;AAGAlR,mBAAMoB,KAAN,CAAYe,QAAZ,CAAqB2F,WAArB,CAAiCoJ,QAAjC;AAEH;;AAED;;;AAGAlR,eAAMG,EAAN,CAAS8K,gBAAT,CAA0BiG,QAA1B;;AAEA;;;AAGAlR,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCmF,QAAjC;;AAEA;;;AAGAlR,eAAMG,EAAN,CAAS8C,UAAT;;AAGA,aAAKmO,cAAL,EAAsB;;AAElB;;;AAGA,iBAAIK,oBAAoBzR,MAAMY,KAAN,CAAY8Q,oBAAZ,MAAsC,CAAC,CAA/D;;AAGA,iBAAID,qBAAqB,CAAC,CAA1B,EAA6B;;AAGzB,qBAAIE,kBAAkBT,SAAS5B,aAAT,CAAuB,mBAAvB,CAAtB;AAAA,qBACIsC,YAAkBnO,SAASoO,cAAT,CAAwB,EAAxB,CADtB;;AAGAF,iCAAgB7J,WAAhB,CAA4B8J,SAA5B;AACA5R,uBAAMY,KAAN,CAAYkR,GAAZ,CAAgBH,eAAhB,EAAiC,CAAjC,EAAoC,CAApC;;AAEA3R,uBAAMQ,OAAN,CAAcuR,IAAd;AACA/R,uBAAMQ,OAAN,CAAcwR,cAAd;AAGH,cAbD,MAaO;;AAEH;AACAC,4BAAW,YAAY;;AAEnB;AACAjS,2BAAMY,KAAN,CAAYsR,cAAZ,CAA2BT,iBAA3B;AACAzR,2BAAMQ,OAAN,CAAcuR,IAAd;AACA/R,2BAAMQ,OAAN,CAAcsG,IAAd;AAEH,kBAPD,EAOG,EAPH;AASH;AAEJ;AAEJ,MAhFD;;AAkFA;;;;;;;AAOAvG,aAAQ4R,WAAR,GAAsB,UAASC,cAAT,EAAyBlB,QAAzB,EAAmC/H,IAAnC,EAAwC;;AAE1D,aAAIkJ,mBAAmBrS,MAAMO,OAAN,CAAciR,eAAd,CAA8BN,QAA9B,EAAwC/H,IAAxC,CAAvB;;AAEA;AACAnJ,eAAMO,OAAN,CAAcwQ,YAAd,CAA2BqB,cAA3B,EAA2CC,gBAA3C;;AAEA;AACArS,eAAMG,EAAN,CAAS8C,UAAT;AACH,MATD;;AAWA;;;;;;;;;;AAUA1C,aAAQ+R,8BAAR,GAAyC,UAAUpH,KAAV,EAAiBqH,QAAjB,EAA2B;;AAEhE;;;;AAIA,aAAIC,cAActH,MAAMmD,UAAxB;AAAA,aACIhB,KADJ;AAAA,aAEIwD,IAFJ;AAAA,aAGIxB,IAHJ;;AAKA,cAAIhC,QAAQ,CAAZ,EAAeA,QAAQmF,YAAYjG,MAAnC,EAA2Cc,OAA3C,EACA;AACIwD,oBAAO2B,YAAYnF,KAAZ,CAAP;;AAEA,iBAAIwD,KAAK/K,QAAL,IAAiB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAA1C,EAAgD;;AAE5C0K,wBAAOwB,KAAKjB,WAAL,CAAiB6C,IAAjB,EAAP;;AAEA;;;AAGA,qBAAIpD,SAAS,EAAb,EAAiB;;AAEbnE,2BAAMwH,WAAN,CAAkB7B,IAAlB;AACA0B;AACH;AACJ;AACJ;;AAED,aAAIrH,MAAMmD,UAAN,CAAiB9B,MAAjB,KAA4B,CAAhC,EAAmC;AAC/B,oBAAO9I,SAASoO,cAAT,CAAwB,EAAxB,CAAP;AACH;;AAED;AACA,aAAKU,WAAW,CAAhB,EACIA,WAAW,CAAX;;AAEJ,aAAII,qBAAqB,KAAzB;;AAEA;AACA,aAAIJ,aAAa,CAAjB,EAAoB;AAChBI,kCAAqB,IAArB;AACAJ,wBAAW,CAAX;AACH;;AAED,gBAAQA,QAAR,EAAmB;;AAEf;AACA,iBAAKI,kBAAL,EAA0B;AACtBzH,yBAAQA,MAAMmD,UAAN,CAAiB,CAAjB,CAAR;AACH,cAFD,MAEO;AACHnD,yBAAQA,MAAMmD,UAAN,CAAiBkE,WAAW,CAA5B,CAAR;AACH;;AAED,iBAAKrH,MAAMpF,QAAN,IAAkB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBC,GAA5C,EAAiD;;AAE7C6N,4BAAWrH,MAAMmD,UAAN,CAAiB9B,MAA5B;AAEH,cAJD,MAIO,IAAIrB,MAAMpF,QAAN,IAAkB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAA3C,EAAiD;;AAEpD4N,4BAAW,CAAX;AACH;AAEJ;;AAED,gBAAOrH,KAAP;AACH,MAnED;;AAqEA;;;AAGA3K,aAAQiR,eAAR,GAA0B,UAAUtG,KAAV,EAAiB/B,IAAjB,EAAuB8E,WAAvB,EAAoCrG,EAApC,EAAwC;;AAE9D,aAAIsJ,WAAelR,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB7Q,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAA1C,EAA2D,EAA3D,CAAnB;AAAA,aACI4G,eAAe5O,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB7Q,MAAMG,EAAN,CAAS4H,SAAT,CAAmBE,aAA1C,EAAyD,EAAzD,CADnB;;AAGA2G,sBAAa9G,WAAb,CAAyBoD,KAAzB;AACAgG,kBAASpJ,WAAT,CAAqB8G,YAArB;;AAEA,aAAIX,WAAJ,EAAiB;AACbW,0BAAaI,SAAb,CAAuByB,GAAvB,CAA2BzQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBG,eAA9C;AACH;;AAEDgJ,kBAASxC,OAAT,CAAiBvF,IAAjB,GAAwBA,IAAxB;AACA+H,kBAASxC,OAAT,CAAiB9G,EAAjB,GAAuBA,MAAM,CAAE,IAAImG,IAAJ,EAA/B;AACA,gBAAOmD,QAAP;AACH,MAfD;;AAiBA;;;AAGA3Q,aAAQqS,QAAR,GAAmB,YAAW;;AAE1B,aAAI5C,YAAYhM,OAAOiM,YAAP,GAAsB4C,UAAtB,CAAiC,CAAjC,CAAhB;;AAEA,gBAAO7C,SAAP;AACH,MALD;;AAOA;;;;;AAKAzP,aAAQuS,UAAR,GAAqB,UAASC,UAAT,EAAqB;;AAEtC,aAAI/C,YAAiBhM,OAAOiM,YAAP,EAArB;AAAA,aACIE,aAAiBH,UAAUG,UAD/B;AAAA,aAEI6C,iBAAiB7C,WAAWP,WAFhC;AAAA,aAGIqD,cAAiBjD,UAAUkD,YAH/B;AAAA,aAIIC,eAJJ;AAAA,aAKIC,mBALJ;AAAA,aAMIC,cANJ;AAAA,aAOIC,kBAPJ;;AASA,aAAIC,eAAevT,MAAMO,OAAN,CAAcsP,WAAd,CAA0BP,aAA1B,CAAwC,mBAAxC,CAAnB;;AAGA6D,2BAAsBH,eAAeQ,SAAf,CAAyB,CAAzB,EAA4BP,WAA5B,CAAtB;AACAI,0BAAsBL,eAAeQ,SAAf,CAAyBP,WAAzB,CAAtB;;AAEAG,+BAAsB3P,SAASoO,cAAT,CAAwBsB,eAAxB,CAAtB;;AAEA,aAAIE,cAAJ,EAAoB;AAChBC,kCAAsB7P,SAASoO,cAAT,CAAwBwB,cAAxB,CAAtB;AACH;;AAED,aAAII,iBAAiB,EAArB;AAAA,aACIC,aAAiB,EADrB;AAAA,aAEIC,iBAAiB,KAFrB;;AAIA,aAAIL,kBAAJ,EAAwB;AACpBI,wBAAWxE,IAAX,CAAgBoE,kBAAhB;AACH;;AAED,cAAM,IAAI3G,IAAI,CAAR,EAAWiH,KAAjB,EAAwB,CAAC,EAAEA,QAAQL,aAAalF,UAAb,CAAwB1B,CAAxB,CAAV,CAAzB,EAAgEA,GAAhE,EAAqE;;AAEjE,iBAAKiH,SAASzD,UAAd,EAA2B;AACvB,qBAAK,CAACwD,cAAN,EAAsB;AAClBF,oCAAevE,IAAf,CAAoB0E,KAApB;AACH,kBAFD,MAEO;AACHF,gCAAWxE,IAAX,CAAgB0E,KAAhB;AACH;AACJ,cAND,MAMO;AACHD,kCAAiB,IAAjB;AACH;AAEJ;;AAED;AACA3T,eAAMoC,KAAN,CAAYG,MAAZ,CAAmBwQ,UAAnB,EAA+B3E,SAA/B,GAA2C,EAA3C;;AAEA;;;AAGA,aAAIyF,uBAAuBJ,eAAelH,MAA1C;;AAEA,cAAII,IAAI,CAAR,EAAWA,IAAIkH,oBAAf,EAAqClH,GAArC,EAA0C;AACtC3M,mBAAMoC,KAAN,CAAYG,MAAZ,CAAmBwQ,UAAnB,EAA+BjL,WAA/B,CAA2C2L,eAAe9G,CAAf,CAA3C;AACH;;AAED3M,eAAMoC,KAAN,CAAYG,MAAZ,CAAmBwQ,UAAnB,EAA+BjL,WAA/B,CAA2CsL,mBAA3C;;AAEA;;;AAGA,aAAIU,mBAAmBJ,WAAWnH,MAAlC;AAAA,aACIwH,UAAmBtQ,SAASgE,aAAT,CAAuB,KAAvB,CADvB;;AAGA,cAAIkF,IAAI,CAAR,EAAWA,IAAImH,gBAAf,EAAiCnH,GAAjC,EAAsC;AAClCoH,qBAAQjM,WAAR,CAAoB4L,WAAW/G,CAAX,CAApB;AACH;;AAEDoH,mBAAUA,QAAQ3F,SAAlB;;AAEA;AACA,aAAI4F,iBAAiB,WAArB;;AAEA;;;AAGAhU,eAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,mBAAQkQ,cADc;AAEtB9I,oBAAQlL,MAAMS,KAAN,CAAYuT,cAAZ,EAA4BpI,MAA5B,CAAmC;AACvCyD,uBAAO0E;AADgC,cAAnC;AAFc,UAA1B,EAKG,IALH;AAOH,MApFD;;AAsFA;;;;AAIAxT,aAAQ0T,WAAR,GAAsB,UAASxC,iBAAT,EAA4ByC,gBAA5B,EAA8C;;AAEhE;AACA,aAAIzC,sBAAsB,CAA1B,EAA6B;AACzB;AACH;;AAED,aAAI0C,WAAJ;AAAA,aACIC,sBAAsBpU,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,iBAAnB,EAAsCrD,SADhE;;AAGA,aAAI,CAAC8F,gBAAL,EAAuB;;AAEnBC,2BAAcnU,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,oBAAoB,CAAvC,CAAd;AAEH,UAJD,MAIO;;AAEH0C,2BAAcnU,MAAMoC,KAAN,CAAYG,MAAZ,CAAmB2R,gBAAnB,CAAd;AAEH;;AAEDC,qBAAY/F,SAAZ,IAAyBgG,mBAAzB;AACH,MArBD;;AAuBA;;;;;;AAMA7T,aAAQ8T,KAAR,GAAgB,UAASC,QAAT,EAAmB;;AAE/B,aAAIC,cAAcvU,MAAMO,OAAN,CAAcsP,WAAhC;AAAA,aACI1G,OAAcoL,YAAY7F,OAAZ,CAAoBvF,IADtC;;AAGA,aAAInJ,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBqL,cAAtB,EAAsC;AAClCxU,mBAAMO,OAAN,CAAckU,QAAd,CAAuBH,SAASI,UAAhC;AACH,UAFD,MAEO;AACH1U,mBAAMO,OAAN,CAAcoU,gBAAd,CAA+BL,SAASI,UAAxC;AACH;AAEJ,MAXD;;AAaA;;;;;;AAMAnU,aAAQoU,gBAAR,GAA2B,UAASvT,KAAT,EAAgB;;AAEvC,aAAIyP,OAAWzP,MAAM,CAAN,CAAf;AAAA,aACIwT,WAAWnR,SAASoO,cAAT,CAAwBhB,KAAKjB,WAA7B,CADf;;AAGA,aAAI5P,MAAME,IAAN,CAAW0F,SAAX,CAAqBiL,IAArB,CAAJ,EAAgC;AAC5BA,kBAAKvM,UAAL,CAAgB6M,YAAhB,CAA6ByD,QAA7B,EAAuC/D,IAAvC;AACH;AACJ,MARD;;AAUA;;;;;;;AAOAtQ,aAAQkU,QAAR,GAAmB,UAASrQ,MAAT,EAAiB;;AAEhC,aAAI,CAACA,MAAL,EAAa;AACT;AACH;;AAED,cAAK,IAAIuI,IAAI,CAAb,EAAgBA,IAAIvI,OAAOiK,UAAP,CAAkB9B,MAAtC,EAA8CI,GAA9C,EAAmD;AAC/C,kBAAKkI,GAAL,CAASzQ,OAAOiK,UAAP,CAAkB1B,CAAlB,CAAT;AACH;AACJ,MATD;;AAWA;;;;AAIApM,aAAQuU,WAAR,GAAsB,UAAS1Q,MAAT,EAAiB;;AAEnC,aAAI2Q,IAAJ;AAAA,aACIhB,UAAU,IADd;AAAA,aAEIiB,YAAc,CAAC,GAAD,EAAM,YAAN,EAAoB,IAApB,EAA0B,MAA1B,EAAkC,IAAlC,EAAwC,IAAxC,EAA8C,IAA9C,EAAoD,IAApD,EAA0D,IAA1D,EAAgE,IAAhE,EAAsE,IAAtE,EAA4E,IAA5E,EAAkF,KAAlF,EAAyF,KAAzF,EAAgG,QAAhG,EAA0G,SAA1G,CAFlB;AAAA,aAGIC,cAAc,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,IAA1B,CAHlB;AAAA,aAIIC,cAAc,CAACD,YAAYE,QAAZ,CAAqB/Q,OAAOgR,OAA5B,CAJnB;AAAA,aAKIC,qBAAqBL,UAAUG,QAAV,CAAmB/Q,OAAOgR,OAA1B,CALzB;;AAOA,aAAI,CAACpV,MAAME,IAAN,CAAW0F,SAAX,CAAqBxB,MAArB,CAAL,EAAkC;AAC9B,oBAAOA,MAAP;AACH;;AAED,aAAI,CAACA,OAAOE,UAAZ,EAAuB;AACnB,oBAAOF,MAAP;AACH;;AAED,aAAI8Q,WAAJ,EAAiB;;AAEb,iBAAIG,kBAAJ,EAAwB;;AAEpBtB,2BAAUtQ,SAASgE,aAAT,CAAuB,GAAvB,CAAV;AACAsM,yBAAQ3F,SAAR,GAAoBhK,OAAOgK,SAA3B;AACAhK,wBAAOE,UAAP,CAAkB6M,YAAlB,CAA+B4C,OAA/B,EAAwC3P,MAAxC;AACAA,0BAAS2P,OAAT;AAEH,cAPD,MAOO;;AAEHA,2BAAUtQ,SAASoO,cAAT,OAA4BzN,OAAOwL,WAAnC,OAAV;AACAmE,yBAAQnE,WAAR,GAAsBmE,QAAQnE,WAAR,CAAoB0F,OAApB,CAA4B,SAA5B,EAAuC,GAAvC,CAAtB;AACAlR,wBAAOE,UAAP,CAAkB6M,YAAlB,CAA+B4C,OAA/B,EAAwC3P,MAAxC;AAEH;AACJ;;AAED;AACA,aAAIA,OAAOgR,OAAP,IAAkB,GAAtB,EAA2B;AACvBL,oBAAO3Q,OAAOmR,YAAP,CAAoB,MAApB,CAAP;AACH;;AAED;AACA,gBAAMnR,OAAOoR,UAAP,CAAkBjJ,MAAlB,GAA2B,CAAjC,EAAoC;AAChCnI,oBAAOqR,eAAP,CAAuBrR,OAAOoR,UAAP,CAAkB,CAAlB,EAAqBnM,IAA5C;AACH;;AAED;AACA,aAAI0L,IAAJ,EAAU;AACN3Q,oBAAOyH,YAAP,CAAoB,MAApB,EAA4BkJ,IAA5B;AACH;;AAED,gBAAO3Q,MAAP;AAEH,MApDD;;AAsDA;;;;;AAKA7D,aAAQsU,GAAR,GAAc,UAAShP,EAAT,EAAa;;AAEvB,aAAI,CAAC7F,MAAME,IAAN,CAAW0F,SAAX,CAAqBC,EAArB,CAAL,EACI;;AAEJ,aAAI6P,YAAY,KAAKZ,WAAL,CAAiBjP,EAAjB,CAAhB;;AAEA,cAAI,IAAI8G,IAAI,CAAZ,EAAeA,IAAI+I,UAAUrH,UAAV,CAAqB9B,MAAxC,EAAgDI,GAAhD,EAAqD;AACjD,kBAAKkI,GAAL,CAASa,UAAUrH,UAAV,CAAqB1B,CAArB,CAAT;AACH;AAEJ,MAXD;;AAaA,YAAOpM,OAAP;AAEH,EAxnBa,CAwnBX,EAxnBW,CAAd;;AA0nBAT,QAAOC,OAAP,GAAiBQ,OAAjB,C;;;;;;;;AC1nBA,KAAIC,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQP,IAAR,GAAe,YAAW;AACtBO,iBAAQQ,QAAR,GAAmB,mBAAAnB,CAAQ,CAAR,CAAnB;AACAW,iBAAQ6K,MAAR,GAAmB,mBAAAxL,CAAQ,EAAR,CAAnB;AACAW,iBAAQmB,OAAR,GAAmB,mBAAA9B,CAAQ,EAAR,CAAnB;AACH,MAJD;;AAMA;;;AAGAW,aAAQmV,oBAAR,GAA+B,EAA/B;;AAEAnV,aAAQoV,aAAR,GAAwB,EAAxB;;AAEApV,aAAQqV,MAAR,GAAiB,KAAjB;;AAEArV,aAAQsV,OAAR,GAAkB,IAAlB;;AAEA;;;AAGAtV,aAAQsG,IAAR,GAAe,YAAW;;AAEtB9G,eAAMoB,KAAN,CAAYZ,OAAZ,CAAoBwO,SAApB,CAA8ByB,GAA9B,CAAkC,QAAlC;AACA,cAAKoF,MAAL,GAAc,IAAd;AAEH,MALD;;AAOA;;;AAGArV,aAAQuV,KAAR,GAAgB,YAAU;;AAEtB/V,eAAMoB,KAAN,CAAYZ,OAAZ,CAAoBwO,SAApB,CAA8B2B,MAA9B,CAAqC,QAArC;;AAEAnQ,iBAAQqV,MAAR,GAAkB,KAAlB;AACArV,iBAAQsV,OAAR,GAAkB,IAAlB;;AAEA,cAAK,IAAI/K,MAAT,IAAmB/K,MAAMoB,KAAN,CAAYc,cAA/B,EAA8C;AAC1ClC,mBAAMoB,KAAN,CAAYc,cAAZ,CAA2B6I,MAA3B,EAAmCiE,SAAnC,CAA6C2B,MAA7C,CAAoD,UAApD;AACH;;AAED;AACA3Q,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;AACA/V,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB+U,KAAvB;AAEH,MAfD;;AAiBAvV,aAAQwV,MAAR,GAAiB,YAAU;;AAEvB,aAAK,CAAC,KAAKH,MAAX,EAAmB;;AAEf,kBAAK/O,IAAL;AAEH,UAJD,MAIO;;AAEH,kBAAKiP,KAAL;AAEH;AAEJ,MAZD;;AAcAvV,aAAQyV,cAAR,GAAyB,YAAW;AAChCjW,eAAMoB,KAAN,CAAYQ,UAAZ,CAAuBoN,SAAvB,CAAiCyB,GAAjC,CAAqC,MAArC;AACH,MAFD;;AAIAjQ,aAAQwR,cAAR,GAAyB,YAAW;AAChChS,eAAMoB,KAAN,CAAYQ,UAAZ,CAAuBoN,SAAvB,CAAiC2B,MAAjC,CAAwC,MAAxC;AACH,MAFD;;AAIA;;;AAGAnQ,aAAQuR,IAAR,GAAe,YAAW;;AAEtB;AACA/R,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;;AAEA,aAAI,CAAC/V,MAAMO,OAAN,CAAcsP,WAAnB,EAAgC;AAC5B;AACH;;AAED,aAAIqG,gBAAgBlW,MAAMoB,KAAN,CAAYZ,OAAZ,CAAoB2V,YAApB,IAAoCnW,MAAMQ,OAAN,CAAcmV,oBAAtE;AAAA,aACIS,iBAAiBpW,MAAMO,OAAN,CAAcsP,WAAd,CAA0BwG,SAA1B,GAAuCrW,MAAMQ,OAAN,CAAcmV,oBAAd,GAAqC,CAA5E,GAAiF3V,MAAMQ,OAAN,CAAcoV,aADpH;;AAGA5V,eAAMoB,KAAN,CAAYZ,OAAZ,CAAoB8V,KAApB,CAA0BC,SAA1B,uBAAwDC,KAAKC,KAAL,CAAWL,cAAX,CAAxD;;AAEA;AACApW,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB0V,iBAAvB;AAEH,MAjBD;;AAmBA,YAAOlW,OAAP;AAEH,EA/Fa,CA+FX,EA/FW,CAAd;;AAiGAA,SAAQP,IAAR;;AAEAH,QAAOC,OAAP,GAAiBS,OAAjB,C;;;;;;;;ACnGA,KAAIQ,WAAY,UAASA,QAAT,EAAmB;;AAE/BA,cAASf,IAAT,GAAgB,YAAW;AACvBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAmB,cAAS6U,MAAT,GAAkB,KAAlB;;AAEA7U,cAAS2V,OAAT,GAAmB,IAAnB;AACA3V,cAASU,OAAT,GAAmB,IAAnB;;AAEAV,cAAS8M,KAAT,GAAiB,IAAjB;;AAEA;;;AAGA9M,cAAS8F,IAAT,GAAgB,UAAS8P,QAAT,EAAkB;;AAE9B;;;;AAIA,aAAI,CAAC5W,MAAMS,KAAN,CAAYmW,QAAZ,CAAD,IAA0B,CAAC5W,MAAME,IAAN,CAAW0F,SAAX,CAAqB5F,MAAMS,KAAN,CAAYmW,QAAZ,EAAsB5V,QAA3C,CAA/B,EAAsF;;AAElFhB,mBAAME,IAAN,CAAWkD,GAAX,iBAA0BwT,QAA1B,2BAAuD,MAAvD;AACA;AAEH,UALD,MAKO;;AAEH5W,mBAAMoB,KAAN,CAAYY,cAAZ,CAA2B8F,WAA3B,CAAuC9H,MAAMS,KAAN,CAAYmW,QAAZ,EAAsB5V,QAA7D;AAEH;;AAED,aAAIuS,eAAevT,MAAMO,OAAN,CAAcsP,WAAjC;;AAEA;AACA7P,eAAMoB,KAAN,CAAYW,aAAZ,CAA0BiN,SAA1B,CAAoCyB,GAApC,CAAwC,QAAxC;AACAzQ,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB+H,kBAAvB;AACA,cAAK8M,MAAL,GAAc,IAAd;AACH,MAvBD;;AAyBA;;;AAGA7U,cAAS+U,KAAT,GAAiB,YAAU;;AAEvB/V,eAAMoB,KAAN,CAAYW,aAAZ,CAA0BiN,SAA1B,CAAoC2B,MAApC,CAA2C,QAA3C;AACA3Q,eAAMoB,KAAN,CAAYY,cAAZ,CAA2BoM,SAA3B,GAAuC,EAAvC;;AAEA,cAAKyH,MAAL,GAAc,KAAd;AAEH,MAPD;;AASA;;;AAGA7U,cAASgV,MAAT,GAAkB,UAAUY,QAAV,EAAoB;;AAElC,aAAK,CAAC,KAAKf,MAAX,EAAmB;;AAEf,kBAAK/O,IAAL,CAAU8P,QAAV;AAEH,UAJD,MAIO;;AAEH,kBAAKb,KAAL;AAEH;AAEJ,MAZD;;AAcA;;;AAGA/U,cAAS+H,kBAAT,GAA8B,YAAW;;AAErC;AACA,aAAI8N,eAAJ;;AAEA;AACA7W,eAAMoB,KAAN,CAAYa,eAAZ,CAA4BmM,SAA5B,GAAwC,EAAxC;;AAGA;AACAyI,2BAAkB7W,MAAMQ,OAAN,CAAcQ,QAAd,CAAuB8V,mBAAvB,EAAlB;;AAEA;;;;AAIA;;;;AAIA9W,eAAMoB,KAAN,CAAYa,eAAZ,CAA4B6F,WAA5B,CAAwC+O,eAAxC;AAEH,MAtBD;;AAwBA;;;;;;;;;AASA7V,cAAS8V,mBAAT,GAA+B,YAAW;;AAEtC,aAAIC,sBAAsB/W,MAAMQ,OAAN,CAAcQ,QAAd,CAAuB+V,mBAAvB,EAA1B;AAAA,aACIJ,OADJ;AAAA,aAEInT,IAFJ;;AAIA,aAAI,CAACuT,mBAAL,EAA0B;;AAEtBvT,oBAAO;AACH4K,4BAAY;AADT,cAAP;AAIH,UAND,MAMO;;AAEH5K,oBAAO;AACH4K,4BAAY;AADT,cAAP;AAIH;;AAEDuI,mBAAU3W,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB7Q,MAAMG,EAAN,CAAS4H,SAAT,CAAmBM,aAA1C,EAAyD7E,IAAzD,CAAV;AACAmT,iBAAQvM,gBAAR,CAAyB,OAAzB,EAAkCpK,MAAMQ,OAAN,CAAcQ,QAAd,CAAuBgW,cAAzD,EAAyE,KAAzE;;AAEA,gBAAOL,OAAP;AACH,MAxBD;;AA0BA;;;AAGA3V,cAASgW,cAAT,GAA0B,YAAW;;AAEjC,aAAInH,cAAc7P,MAAMO,OAAN,CAAcsP,WAAhC;;AAEAA,qBAAYb,SAAZ,CAAsBgH,MAAtB,CAA6BhW,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAAhD;;AAEApI,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB+U,KAAvB;AACH,MAPD;;AASA/U,cAAS+V,mBAAT,GAA+B,YAAW;;AAEtC,aAAIxD,eAAevT,MAAMO,OAAN,CAAcsP,WAAjC;;AAEA,aAAI0D,YAAJ,EAAkB;AACd,oBAAOA,aAAavE,SAAb,CAAuBC,QAAvB,CAAgCjP,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAAnD,CAAP;AACH,UAFD,MAEO;AACH,oBAAO,KAAP;AACH;AACJ,MATD;;AAWA;;;AAGApH,cAAS4H,qBAAT,GAAiC,YAAW;;AAExC,aAAIqO,qBAAsBjX,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,MAAhB,EAAwB,wBAAxB,EAAkD,EAAlD,CAA1B;AAAA,aACIqG,gBAAgBlX,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,MAAhB,EAAwB,4BAAxB,EAAsD,EAAEzC,WAAY,+BAAd,EAAtD,CADpB;AAAA,aAEI+I,gBAAgBnX,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB,iCAAvB,EAA0D,EAA1D,CAFpB;AAAA,aAGIuG,gBAAgBpX,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB,4BAAvB,EAAqD,EAAEjB,aAAc,cAAhB,EAArD,CAHpB;AAAA,aAIIyH,eAAgBrX,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB,2BAAvB,EAAoD,EAAEjB,aAAc,mBAAhB,EAApD,CAJpB;;AAMAsH,uBAAc9M,gBAAd,CAA+B,OAA/B,EAAwCpK,MAAMQ,OAAN,CAAcQ,QAAd,CAAuBsW,mBAA/D,EAAoF,KAApF;;AAEAF,uBAAchN,gBAAd,CAA+B,OAA/B,EAAwCpK,MAAMQ,OAAN,CAAcQ,QAAd,CAAuBuW,sBAA/D,EAAuF,KAAvF;;AAEAF,sBAAajN,gBAAb,CAA8B,OAA9B,EAAuCpK,MAAMQ,OAAN,CAAcQ,QAAd,CAAuBwW,qBAA9D,EAAqF,KAArF;;AAEAL,uBAAcrP,WAAd,CAA0BsP,aAA1B;AACAD,uBAAcrP,WAAd,CAA0BuP,YAA1B;;AAEAJ,4BAAmBnP,WAAnB,CAA+BoP,aAA/B;AACAD,4BAAmBnP,WAAnB,CAA+BqP,aAA/B;;AAEA;AACAnX,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB2V,OAAvB,GAAiCO,aAAjC;AACAlX,eAAMQ,OAAN,CAAcQ,QAAd,CAAuBU,OAAvB,GAAiCyV,aAAjC;;AAEA,gBAAOF,kBAAP;AAEH,MA1BD;;AA4BAjW,cAASsW,mBAAT,GAA+B,YAAW;;AAEtC,aAAIG,SAASzX,MAAMQ,OAAN,CAAcQ,QAAd,CAAuBU,OAApC;;AAEA,aAAI+V,OAAOzI,SAAP,CAAiBC,QAAjB,CAA0B,QAA1B,CAAJ,EAAyC;AACrCjP,mBAAMQ,OAAN,CAAcQ,QAAd,CAAuB0V,iBAAvB;AACH,UAFD,MAEO;AACH1W,mBAAMQ,OAAN,CAAcQ,QAAd,CAAuB0W,iBAAvB;AACH;;AAED1X,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;AACA/V,eAAMQ,OAAN,CAAcQ,QAAd,CAAuB+U,KAAvB;AAEH,MAbD;;AAeA/U,cAASwW,qBAAT,GAAiC,YAAW;;AAExCxX,eAAMQ,OAAN,CAAcQ,QAAd,CAAuBU,OAAvB,CAA+BsN,SAA/B,CAAyC2B,MAAzC,CAAgD,QAAhD;AACH,MAHD;;AAKA3P,cAASuW,sBAAT,GAAkC,YAAW;;AAEzC,aAAIhE,eAAevT,MAAMO,OAAN,CAAcsP,WAAjC;AAAA,aACI8H,qBADJ;;AAGApE,sBAAa5C,MAAb;;AAEAgH,iCAAwB3X,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBkM,UAArB,CAAgC9B,MAAxD;;AAEA;;;AAGA,aAAIoL,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA3X,mBAAMO,OAAN,CAAcsP,WAAd,GAA4B,IAA5B;;AAEA;AACA7P,mBAAMG,EAAN,CAASsL,eAAT;AACH;;AAEDzL,eAAMG,EAAN,CAAS8C,UAAT;;AAEAjD,eAAMQ,OAAN,CAAcuV,KAAd;AACH,MAxBD;;AA0BA/U,cAAS0W,iBAAT,GAA6B,YAAW;AACpC1X,eAAMQ,OAAN,CAAcQ,QAAd,CAAuBU,OAAvB,CAA+BsN,SAA/B,CAAyCyB,GAAzC,CAA6C,QAA7C;AACH,MAFD;;AAIAzP,cAAS0V,iBAAT,GAA6B,YAAW;AACpC1W,eAAMQ,OAAN,CAAcQ,QAAd,CAAuBU,OAAvB,CAA+BsN,SAA/B,CAAyC2B,MAAzC,CAAgD,QAAhD;AACH,MAFD;;AAIA,YAAO3P,QAAP;AAEH,EAlPc,CAkPZ,EAlPY,CAAf;;AAoPAA,UAASf,IAAT;;AAEAH,QAAOC,OAAP,GAAiBiB,QAAjB,C;;;;;;;;ACtPA,KAAIqK,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAOpL,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIAoL,YAAOuM,aAAP,GAAuB,IAAvB;AACAvM,YAAOwM,aAAP,GAAuB,IAAvB;AACAxM,YAAOyM,cAAP,GAAwB,IAAxB;;AAEA;;;;AAIAzM,YAAO0M,eAAP,GAAyB,IAAzB;;AAEA;;;;;AAKA1M,YAAOC,IAAP,GAAc,YAAW;;AAErB,aAAI0M,eAAe,KAAKC,gBAAL,EAAnB;AAAA,aACIzX,UAAeR,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAD7C;AAAA,aAEIG,UAAezB,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAF7C;;AAIA,aAAIuW,aAAazL,MAAb,GAAsB,CAA1B,EAA6B;;AAEzB;AACAvM,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB0G,IAArB;;AAEA;AACAvR,qBAAQwO,SAAR,CAAkByB,GAAlB,CAAsB,QAAtB;;AAEA;AACAzQ,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB6M,WAArB;AACH;AAEJ,MAzBD;;AA2BA;;;;;AAKA7M,YAAO0K,KAAP,GAAe,YAAW;AACtB,aAAIvV,UAAUR,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAAxC;AACAd,iBAAQwO,SAAR,CAAkB2B,MAAlB,CAAyB,QAAzB;AACH,MAHD;;AAKA;;;;;AAKAtF,YAAO0G,IAAP,GAAc,YAAW;;AAErB,aAAI,CAAC,KAAK+F,cAAV,EAA0B;AACtB,kBAAKA,cAAL,GAAsB,KAAKK,iBAAL,EAAtB;AACH;;AAED,aAAIC,SAAkB,KAAKC,kBAAL,EAAtB;AAAA,aACIzC,gBAAkB,CADtB;AAAA,aAEIpV,UAAkBR,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BF,OAFhD;AAAA,aAGIgX,cAHJ;AAAA,aAIIC,cAJJ;;AAMA,aAAI/X,QAAQgY,YAAR,KAAyB,CAA7B,EAAgC;AAC5B5C,6BAAgB,EAAhB;AACH;;AAED0C,0BAAiBF,OAAOK,CAAP,GAAW,KAAKX,cAAL,CAAoBY,IAAhD;AACAH,0BAAiBH,OAAOO,CAAP,GAAW3U,OAAO4U,OAAlB,GAA4B,KAAKd,cAAL,CAAoBe,GAAhD,GAAsDjD,aAAtD,GAAsEpV,QAAQgY,YAA/F;;AAEAhY,iBAAQ8V,KAAR,CAAcC,SAAd,oBAAyCC,KAAKC,KAAL,CAAW6B,cAAX,CAAzC,YAA0E9B,KAAKC,KAAL,CAAW8B,cAAX,CAA1E;;AAEA;AACAvY,eAAMQ,OAAN,CAAc6K,MAAd,CAAqByN,YAArB;AACA9Y,eAAMQ,OAAN,CAAc6K,MAAd,CAAqB0N,WAArB;AAEH,MAzBD;;AA2BA;;;;;;AAMA1N,YAAOW,WAAP,GAAqB,UAASxB,KAAT,EAAgB1G,IAAhB,EAAsB;;AAEvC;;;;AAIA,iBAAQA,IAAR;AACI,kBAAK,YAAL;AAAoB9D,uBAAMQ,OAAN,CAAc6K,MAAd,CAAqB2N,gBAArB,CAAsCxO,KAAtC,EAA6C1G,IAA7C,EAAoD;AACxE,kBAAK,YAAL;AAAoB9D,uBAAMQ,OAAN,CAAc6K,MAAd,CAAqB4N,gBAArB,CAAsCzO,KAAtC,EAA6C1G,IAA7C,EAAoD;AACxE;AAAoB9D,uBAAMQ,OAAN,CAAc6K,MAAd,CAAqB6N,iBAArB,CAAuCpV,IAAvC,EAA8C;AAHtE;;AAMA;;;;AAIA9D,eAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkC4M,UAAlC,CAA6C8K,OAA7C,CAAqDnZ,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB+N,UAA1E;AACH,MAjBD;;AAmBA;;;;;AAKA/N,YAAO8M,iBAAP,GAA2B,YAAW;;AAElC,aAAI7W,UAAUtB,MAAMoB,KAAN,CAAYE,OAA1B;AAAA,aACI+X,SAAU,KAAKC,SAAL,CAAehY,OAAf,CADd;;AAGA,cAAKwW,cAAL,GAAsBuB,MAAtB;AACA,gBAAOA,MAAP;AAEH,MARD;;AAUA;;;;;;;;AAQAhO,YAAOiO,SAAP,GAAmB,UAAWzT,EAAX,EAAgB;;AAE/B,aAAI0T,KAAK,CAAT;AACA,aAAIC,KAAK,CAAT;;AAEA,gBAAO3T,MAAM,CAAC4T,MAAO5T,GAAG6T,UAAV,CAAP,IAAiC,CAACD,MAAO5T,GAAGwQ,SAAV,CAAzC,EAAiE;AAC7DkD,mBAAO1T,GAAG6T,UAAH,GAAgB7T,GAAG8T,UAA1B;AACAH,mBAAO3T,GAAGwQ,SAAH,GAAexQ,GAAG+T,SAAzB;AACA/T,kBAAKA,GAAGgU,YAAR;AACH;AACD,gBAAO,EAAEhB,KAAKW,EAAP,EAAWd,MAAMa,EAAjB,EAAP;AACH,MAXD;;AAaA;;;;;;AAMAlO,YAAOgN,kBAAP,GAA4B,YAAW;;AAEnC,aAAIyB,MAAMrW,SAASuM,SAAnB;AAAA,aAA8B+J,KAA9B;AACA,aAAItB,IAAI,CAAR;AAAA,aAAWE,IAAI,CAAf;;AAEA,aAAImB,GAAJ,EAAS;;AAEL,iBAAIA,IAAIhW,IAAJ,IAAY,SAAhB,EAA2B;AACvBiW,yBAAQD,IAAIE,WAAJ,EAAR;AACAD,uBAAME,QAAN,CAAe,IAAf;AACAxB,qBAAIsB,MAAMG,YAAV;AACAvB,qBAAIoB,MAAMI,WAAV;AACH;AAEJ,UATD,MASO,IAAInW,OAAOiM,YAAX,EAAyB;;AAE5B6J,mBAAM9V,OAAOiM,YAAP,EAAN;;AAEA,iBAAI6J,IAAIM,UAAR,EAAoB;;AAEhBL,yBAAQD,IAAIjH,UAAJ,CAAe,CAAf,EAAkBwH,UAAlB,EAAR;AACA,qBAAIN,MAAMO,cAAV,EAA0B;AACtBP,2BAAME,QAAN,CAAe,IAAf;AACA,yBAAIM,OAAOR,MAAMO,cAAN,GAAuB,CAAvB,CAAX;AACA7B,yBAAI8B,KAAK7B,IAAT;AACAC,yBAAI4B,KAAK1B,GAAT;AACH;AAEJ;AACJ;AACD,gBAAO,EAAEJ,GAAGA,CAAL,EAAQE,GAAGA,CAAX,EAAP;AACH,MA/BD;;AAiCA;;;;;;AAMAtN,YAAO4M,gBAAP,GAA0B,SAASA,gBAAT,GAA2B;;AAEjD,aAAID,eAAe,EAAnB;;AAEA,aAAIhU,OAAOiM,YAAX,EAAwB;AAAE;AACtB+H,4BAAehU,OAAOiM,YAAP,GAAsBuK,QAAtB,EAAf;AACH;;AAED,gBAAOxC,YAAP;AACH,MATD;;AAWA;AACA3M,YAAO6M,WAAP,GAAqB,YAAW;;AAE5B,aAAIzW,UAAUzB,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQuN,SAAR,CAAkByB,GAAlB,CAAsB,QAAtB;;AAEAzQ,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBuM,aAArB,GAAqC,IAArC;;AAEA;AACA5X,eAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkC4M,UAAlC,CAA6C8K,OAA7C,CAAqDnZ,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB+N,UAA1E;AAEH,MAVD;;AAYA;AACA/N,YAAOyN,YAAP,GAAsB,YAAW;AAC7B,aAAIrX,UAAUzB,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQuN,SAAR,CAAkB2B,MAAlB,CAAyB,QAAzB;;AAEA3Q,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBuM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAvM,YAAOoP,WAAP,GAAqB,YAAW;AAC5B,aAAIhD,SAASzX,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOzI,SAAP,CAAiByB,GAAjB,CAAqB,QAArB;;AAEAzQ,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBwM,aAArB,GAAqC,IAArC;AACH,MALD;;AAOA;AACAxM,YAAO0N,WAAP,GAAqB,YAAW;AAC5B,aAAItB,SAASzX,MAAMoB,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOrJ,SAAP,GAAmB,EAAnB;AACAqJ,gBAAOzI,SAAP,CAAiB2B,MAAjB,CAAwB,QAAxB;AACA3Q,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBwM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAxM,YAAO2N,gBAAP,GAA0B,UAASxO,KAAT,EAAgB1G,IAAhB,EAAsB;;AAE5C,aAAI4W,WAAW,KAAKC,YAAL,EAAf;;AAEA,aAAIC,WAAkB5a,MAAMO,OAAN,CAAcsP,WAApC;AAAA,aACIkI,kBAAkB/X,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB0M,eAD3C;;AAGA,aAAI2C,QAAJ,EAAc;;AAEV,iBAAI1K,YAAchM,OAAOiM,YAAP,EAAlB;AAAA,iBACIE,aAAcH,UAAUG,UAD5B;;AAGA4H,+BAAkB/X,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBwP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;;AAMA5a,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqByP,gBAArB,CAAsCF,QAAtC,EAAgD7C,eAAhD;;AAEA/X,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB6N,iBAArB,CAAuC,QAAvC;AAEH,UAjBD,MAiBO;;AAEH;AACA,iBAAIzB,SAASzX,MAAMW,IAAN,CAAWoa,YAAX,EAAb;AACA/a,mBAAMoB,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,CAAkCoG,WAAlC,CAA8C2P,MAA9C;;AAEAzX,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqByN,YAArB;AACA9Y,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBoP,WAArB;;AAEA1C,+BAAkB/X,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBwP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;AAKAnD,oBAAOuD,KAAP;AACAxQ,mBAAMyQ,cAAN;;AAEA;AACAxD,oBAAOrN,gBAAP,CAAwB,SAAxB,EAAmC,UAASI,KAAT,EAAe;;AAE9C,qBAAIA,MAAM0Q,OAAN,IAAiBlb,MAAME,IAAN,CAAW2E,IAAX,CAAgBG,KAArC,EAA4C;;AAExChF,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqByP,gBAArB,CAAsCF,QAAtC,EAAgD7C,eAAhD;AACA/X,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqB8P,SAArB,CAA+B1D,OAAO2D,KAAtC;;AAEA;;;AAGA5Q,2BAAMyQ,cAAN;AACAzQ,2BAAM6Q,wBAAN;;AAEArb,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqBiQ,UAArB;AACH;AAEJ,cAhBD,EAgBG,KAhBH;AAiBH;AACJ,MA9DD;;AAgEAjQ,YAAOsP,YAAP,GAAsB,YAAW;;AAE7B,aAAID,WAAW,KAAf;;AAEA1a,eAAMoB,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkC4M,UAAlC,CAA6C8K,OAA7C,CAAqD,UAAShQ,IAAT,EAAe;AAChE,iBAAIoS,WAAWpS,KAAKuF,OAAL,CAAa5K,IAA5B;;AAEA,iBAAIyX,YAAY,MAAZ,IAAsBpS,KAAK6F,SAAL,CAAeC,QAAf,CAAwB,cAAxB,CAA1B,EAAmE;AAC/DyL,4BAAW,IAAX;AACH;AACJ,UAND;;AAQA,gBAAOA,QAAP;AACH,MAbD;;AAeA;AACArP,YAAO6N,iBAAP,GAA2B,UAASpV,IAAT,EAAe;AACtCL,kBAAS+X,WAAT,CAAqB1X,IAArB,EAA2B,KAA3B,EAAkC,IAAlC;AACH,MAFD;;AAIAuH,YAAO4N,gBAAP,GAA0B,UAASzO,KAAT,EAAgB1G,IAAhB,EAAsB;;AAE5C,aAAI+L,cAAc7P,MAAMO,OAAN,CAAcsP,WAAhC;AAAA,aACIG,YAAchM,OAAOiM,YAAP,EADlB;;AAGAjQ,eAAMQ,OAAN,CAAc6K,MAAd,CAAqB0K,KAArB;;AAEA/V,eAAMe,QAAN,CAAe0P,GAAf,CAAmBZ,WAAnB,EAAgCG,SAAhC;AAEH,MATD;;AAWA;;;;;;;AAOA3E,YAAO8P,SAAP,GAAmB,UAASnV,GAAT,EAAc;;AAE7BvC,kBAAS+X,WAAT,CAAqB,YAArB,EAAmC,KAAnC,EAA0CxV,GAA1C;;AAEA;AACAhG,eAAMQ,OAAN,CAAc6K,MAAd,CAAqB0N,WAArB;AACH,MAND;;AAQA;;;;;AAKA1N,YAAOwP,aAAP,GAAuB,UAASY,WAAT,EAAsB;;AAEzC,aAAI1B,QAAQ/V,OAAOiM,YAAP,GAAsB4C,UAAtB,CAAiC,CAAjC,CAAZ;AAAA,aACI6I,oBAAoB3B,MAAMM,UAAN,EADxB;AAAA,aAEI7X,KAFJ;;AAIAkZ,2BAAkBC,kBAAlB,CAAqCF,WAArC;AACAC,2BAAkBE,MAAlB,CAAyB7B,MAAM8B,cAA/B,EAA+C9B,MAAM+B,WAArD;;AAEAtZ,iBAAQkZ,kBAAkBlB,QAAlB,GAA6BjO,MAArC;;AAEA,gBAAO;AACH/J,oBAAOA,KADJ;AAEHuZ,kBAAKvZ,QAAQuX,MAAMS,QAAN,GAAiBjO;AAF3B,UAAP;AAIH,MAfD;;AAiBA;;;;;;;;AAQAlB,YAAOyP,gBAAP,GAA0B,UAASW,WAAT,EAAsBO,QAAtB,EAAgC;;AAEtD,aAAIjC,QAAYtW,SAASuW,WAAT,EAAhB;AAAA,aACIiC,YAAY,CADhB;;AAGAlC,eAAMmC,QAAN,CAAeT,WAAf,EAA4B,CAA5B;AACA1B,eAAME,QAAN,CAAe,IAAf;;AAEA,aAAIkC,YAAY,CAACV,WAAD,CAAhB;AAAA,aACI5K,IADJ;AAAA,aAEIuL,aAAa,KAFjB;AAAA,aAGIC,OAAO,KAHX;AAAA,aAIIC,aAJJ;;AAMA,gBAAO,CAACD,IAAD,KAAUxL,OAAOsL,UAAUI,GAAV,EAAjB,CAAP,EAA0C;;AAEtC,iBAAI1L,KAAK/K,QAAL,IAAiB,CAArB,EAAwB;;AAEpBwW,iCAAgBL,YAAYpL,KAAKtE,MAAjC;;AAEA,qBAAI,CAAC6P,UAAD,IAAeJ,SAASxZ,KAAT,IAAkByZ,SAAjC,IAA8CD,SAASxZ,KAAT,IAAkB8Z,aAApE,EAAmF;AAC/EvC,2BAAMmC,QAAN,CAAerL,IAAf,EAAqBmL,SAASxZ,KAAT,GAAiByZ,SAAtC;AACAG,kCAAa,IAAb;AACH;AACD,qBAAIA,cAAcJ,SAASD,GAAT,IAAgBE,SAA9B,IAA2CD,SAASD,GAAT,IAAgBO,aAA/D,EAA8E;AAC1EvC,2BAAM6B,MAAN,CAAa/K,IAAb,EAAmBmL,SAASD,GAAT,GAAeE,SAAlC;AACAI,4BAAO,IAAP;AACH;AACDJ,6BAAYK,aAAZ;AACH,cAbD,MAaO;AACH,qBAAI3P,IAAIkE,KAAKxC,UAAL,CAAgB9B,MAAxB;AACA,wBAAOI,GAAP,EAAY;AACRwP,+BAAUjN,IAAV,CAAe2B,KAAKxC,UAAL,CAAgB1B,CAAhB,CAAf;AACH;AACJ;AACJ;;AAED,aAAImN,MAAM9V,OAAOiM,YAAP,EAAV;AACA6J,aAAI0C,eAAJ;AACA1C,aAAI2C,QAAJ,CAAa1C,KAAb;AACH,MAxCD;;AA0CA;;;;;AAKA1O,YAAOiQ,UAAP,GAAoB,YAAW;AAC3B,aAAItL,YAAYhM,OAAOiM,YAAP,EAAhB;AACAD,mBAAUwM,eAAV;AACH,MAHD;;AAKA;;;;;AAKAnR,YAAO+N,UAAP,GAAoB,UAASjQ,IAAT,EAAe;AAC/B,aAAIoS,WAAWpS,KAAKuF,OAAL,CAAa5K,IAA5B;;AAEA,aAAIL,SAASiZ,iBAAT,CAA2BnB,QAA3B,CAAJ,EAA0C;AACtCvb,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBsR,oBAArB,CAA0CxT,IAA1C;AACH,UAFD,MAEO;AACHnJ,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBuR,sBAArB,CAA4CzT,IAA5C;AACH;;AAED;;;;AAIA,aAAI6G,YAAYhM,OAAOiM,YAAP,EAAhB;AAAA,aACI4M,MAAM7M,UAAUG,UAAV,CAAqB7L,UAD/B;;AAGA,aAAIuY,IAAIzH,OAAJ,IAAe,GAAf,IAAsBmG,YAAY,MAAtC,EAA8C;AAC1Cvb,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBsR,oBAArB,CAA0CxT,IAA1C;AACH;AACJ,MAnBD;;AAqBA;;;;;AAKAkC,YAAOsR,oBAAP,GAA8B,UAAS5R,MAAT,EAAiB;AAC3CA,gBAAOiE,SAAP,CAAiByB,GAAjB,CAAqB,cAArB;;AAEA;AACA,aAAI1F,OAAO2D,OAAP,CAAe5K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI6F,OAAOoB,OAAOsD,UAAP,CAAkB,CAAlB,CAAX;AACA1E,kBAAKqF,SAAL,CAAe2B,MAAf,CAAsB,cAAtB;AACAhH,kBAAKqF,SAAL,CAAeyB,GAAf,CAAmB,gBAAnB;AACH;AACJ,MATD;;AAWA;;;;;AAKApF,YAAOuR,sBAAP,GAAgC,UAAS7R,MAAT,EAAiB;AAC7CA,gBAAOiE,SAAP,CAAiB2B,MAAjB,CAAwB,cAAxB;;AAEA;AACA,aAAI5F,OAAO2D,OAAP,CAAe5K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI6F,OAAOoB,OAAOsD,UAAP,CAAkB,CAAlB,CAAX;AACA1E,kBAAKqF,SAAL,CAAe2B,MAAf,CAAsB,gBAAtB;AACAhH,kBAAKqF,SAAL,CAAeyB,GAAf,CAAmB,cAAnB;AACH;AACJ,MATD;;AAYA,YAAOpF,MAAP;AACH,EA1eY,CA0eV,EA1eU,CAAb;;AA4eAA,QAAOpL,IAAP;;AAEAH,QAAOC,OAAP,GAAiBsL,MAAjB,C;;;;;;;;AC9eA,KAAI1J,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,iBAAQ1B,IAAR,GAAe,YAAW;AACtBJ,iBAAA,mBAAAA,CAAQ,CAAR;AACH,UAFD;;AAIA8B,iBAAQkU,MAAR,GAAiB,KAAjB;;AAEA;AACAlU,iBAAQmF,IAAR,GAAe,YAAW;;AAEtB;AACA,qBAAI9G,MAAMQ,OAAN,CAAcQ,QAAd,CAAuB6U,MAA3B,EAAmC;AAC/B7V,+BAAMQ,OAAN,CAAcQ,QAAd,CAAuB+U,KAAvB;AACH;;AAED;AACA/V,uBAAMoB,KAAN,CAAYO,OAAZ,CAAoBqN,SAApB,CAA8ByB,GAA9B,CAAkC,QAAlC;;AAEA;AACAzQ,uBAAMoB,KAAN,CAAYQ,UAAZ,CAAuBoN,SAAvB,CAAiCyB,GAAjC,CAAqC,SAArC;;AAEA;AACAzQ,uBAAMQ,OAAN,CAAcmB,OAAd,CAAsBkU,MAAtB,GAA+B,IAA/B;AAEH,UAhBD;;AAkBA;AACAlU,iBAAQoU,KAAR,GAAgB,YAAW;;AAEvB;AACA/V,uBAAMoB,KAAN,CAAYO,OAAZ,CAAoBqN,SAApB,CAA8B2B,MAA9B,CAAqC,QAArC;;AAEA;AACA3Q,uBAAMoB,KAAN,CAAYQ,UAAZ,CAAuBoN,SAAvB,CAAiC2B,MAAjC,CAAwC,SAAxC;;AAEA;AACA3Q,uBAAMQ,OAAN,CAAcmB,OAAd,CAAsBkU,MAAtB,GAA+B,KAA/B;AAEH,UAXD;;AAaAlU,iBAAQmb,IAAR,GAAe,YAAU;;AAErB,qBAAIC,cAAc/c,MAAMQ,OAAN,CAAcsV,OAAhC;AAAA,qBACIrV,QAAcuc,OAAOnY,IAAP,CAAY7E,MAAMS,KAAlB,CADlB;AAAA,qBAEIwc,aAAcjd,MAAMoB,KAAN,CAAYc,cAF9B;AAAA,qBAGIgb,aAHJ;AAAA,qBAIIC,oBAAoB,CAJxB;AAAA,qBAKIC,YALJ;;AAOA;AACA,sBAAK,IAAIjU,IAAT,IAAiBnJ,MAAMS,KAAvB,EAA+B;AAC3B,6BAAI,CAACT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBG,gBAAvB,EACI6T;AACP;;AAED,qBAAK,CAACJ,WAAN,EAAoB;;AAEhB;AACA,8BAAKK,YAAL,IAAqBH,UAArB;AAAiC;AAAjC;AAEH,kBALD,MAKO;;AAEHC,yCAAgBzc,MAAM4c,OAAN,CAAcN,WAAd,IAA6B,CAA7C;;AAEA,6BAAIO,sBAAsBJ,iBAAiBzc,MAAM8L,MAAN,IAAgB4Q,oBAAoB,CAApC,CAA3C;;AAEA,6BAAKG,mBAAL,EAA2B;;AAEvBJ,iDAAgB,CAAhB;;AAEA;AACA,sCAAK,IAAI/T,IAAT,IAAiBnJ,MAAMS,KAAvB,EAA+B;;AAE3B,6CAAIT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBG,gBAAtB,EAAuC;AACnC;AACH;;AAED4T;AACH;AAEJ;;AAEDE,wCAAe3c,MAAMyc,aAAN,CAAf;AAEH;;AAED,sBAAK,IAAInS,MAAT,IAAmBkS,UAAnB;AAA+BA,oCAAWlS,MAAX,EAAmBiE,SAAnB,CAA6B2B,MAA7B,CAAoC,UAApC;AAA/B,kBACAsM,WAAWG,YAAX,EAAyBpO,SAAzB,CAAmCyB,GAAnC,CAAuC,UAAvC;AACAzQ,uBAAMQ,OAAN,CAAcsV,OAAd,GAAwBsH,YAAxB;AAEH,UAlDD;;AAoDA;;;;AAIAzb,iBAAQqK,WAAR,GAAsB,YAAW;;AAE7B;;;AAGA,qBAAIuR,qBAAqB,CAAC,OAAD,EAAU,MAAV,EAAkB,MAAlB,EAA0B,WAA1B,EAAuC,SAAvC,CAAzB;AAAA,qBACIpU,OAAqBnJ,MAAMS,KAAN,CAAYT,MAAMQ,OAAN,CAAcsV,OAA1B,CADzB;AAAA,qBAEIvB,cAAqBvU,MAAMO,OAAN,CAAcsP,WAFvC;AAAA,qBAGI4B,oBAAqBzR,MAAMY,KAAN,CAAYmS,UAHrC;AAAA,qBAIIzB,eAJJ;AAAA,qBAKIkM,cALJ;AAAA,qBAMI7P,SANJ;;AAQA;AACA2D,mCAAkBnI,KAAKvG,IAAL,EAAlB;;AAEA;AACA+K,6BAAY;AACRzC,gCAAYoG,eADJ;AAERxN,+BAAYqF,KAAKrF,IAFT;AAGRkK,oCAAY;AAHJ,kBAAZ;;AAMA,qBACIuG,eACAgJ,mBAAmBF,OAAnB,CAA2B9I,YAAY7F,OAAZ,CAAoBvF,IAA/C,MAAyD,CAAC,CAD1D,IAEAoL,YAAY3E,WAAZ,CAAwB6C,IAAxB,OAAmC,EAHvC,EAIC;AACG;AACAzS,+BAAMO,OAAN,CAAc4R,WAAd,CAA0BoC,WAA1B,EAAuCjD,eAAvC,EAAwDnI,KAAKrF,IAA7D;AAEH,kBARD,MAQO;;AAEH;AACA9D,+BAAMO,OAAN,CAAcuL,WAAd,CAA0B6B,SAA1B;;AAEA;AACA8D;AAEH;;AAED;AACA+L,kCAAiBrU,KAAKqU,cAAtB;;AAEA,qBAAIA,kBAAkB,OAAOA,cAAP,IAAyB,UAA/C,EAA2D;AACvDA,wCAAe3W,IAAf,CAAoB2D,KAApB;AACH;;AAEDyH,4BAAW,YAAW;;AAElB;AACAjS,+BAAMY,KAAN,CAAY6c,UAAZ,CAAuBhM,iBAAvB;AAEH,kBALD,EAKG,EALH;;AAQA;;;AAGAzR,uBAAMO,OAAN,CAAcwL,kBAAd;;AAEA;;;AAGA/L,uBAAMQ,OAAN,CAAcuR,IAAd;AACH,UAjED;;AAmEA,gBAAOpQ,OAAP;AAEH,EAtKa,CAsKX,EAtKW,CAAd;;AAwKAA,SAAQ1B,IAAR;;AAEAH,QAAOC,OAAP,GAAiB4B,OAAjB,C;;;;;;;;AC1KA,KAAIlB,QAAS,UAASA,KAAT,EAAgB;;AAEzB,YAAOA,KAAP;AAEH,EAJW,CAIT,EAJS,CAAZ;;AAMAX,QAAOC,OAAP,GAAiBU,KAAjB,C;;;;;;;;ACNA,KAAIid,YAAa,UAASA,SAAT,EAAoB;;AAEjCA,mBAAUC,mBAAV,GAAgC,IAAhC;;AAEAD,mBAAUjT,aAAV,GAA0B,UAASD,KAAT,EAAe;AACrC,yBAAQA,MAAM0Q,OAAd;AACI,8BAAKlb,MAAME,IAAN,CAAW2E,IAAX,CAAgBE,GAArB;AAA6B/E,uCAAMU,QAAN,CAAekd,aAAf,CAA6BpT,KAA7B,EAA2C;AACxE,8BAAKxK,MAAME,IAAN,CAAW2E,IAAX,CAAgBG,KAArB;AAA6BhF,uCAAMU,QAAN,CAAemd,eAAf,CAA+BrT,KAA/B,EAA2C;AACxE,8BAAKxK,MAAME,IAAN,CAAW2E,IAAX,CAAgBO,GAArB;AAA6BpF,uCAAMU,QAAN,CAAeod,gBAAf,CAAgCtT,KAAhC,EAA2C;AACxE;AAA+BxK,uCAAMU,QAAN,CAAeqd,iBAAf,CAAiCvT,KAAjC,EAA4C;AAJ/E;AAMH,UAPD;;AASAkT,mBAAUhT,WAAV,GAAwB,UAASF,KAAT,EAAe;AACnC,yBAAQA,MAAM0Q,OAAd;AACI,8BAAKlb,MAAME,IAAN,CAAW2E,IAAX,CAAgBU,EAArB;AACA,8BAAKvF,MAAME,IAAN,CAAW2E,IAAX,CAAgBS,IAArB;AACA,8BAAKtF,MAAME,IAAN,CAAW2E,IAAX,CAAgBY,KAArB;AACA,8BAAKzF,MAAME,IAAN,CAAW2E,IAAX,CAAgBW,IAArB;AAA6BxF,uCAAMU,QAAN,CAAesd,eAAf,CAA+BxT,KAA/B,EAAuC;AAJxE;AAMH,UAPD;;AASAkT,mBAAUE,aAAV,GAA0B,UAASpT,KAAT,EAAe;;AAErC,qBAAK,CAACxK,MAAMQ,OAAN,CAAcqV,MAApB,EAA6B;AACzB7V,+BAAMQ,OAAN,CAAcsG,IAAd;AACH;;AAED,qBAAI9G,MAAMQ,OAAN,CAAcqV,MAAd,IAAwB,CAAC7V,MAAMQ,OAAN,CAAcmB,OAAd,CAAsBkU,MAAnD,EAA2D;AACvD7V,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBmF,IAAtB;AACH,kBAFD,MAEO;AACH9G,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBmb,IAAtB;AACH;;AAEDtS,uBAAMyQ,cAAN;AACH,UAbD;;AAeA;;;;AAIAyC,mBAAUG,eAAV,GAA4B,UAASrT,KAAT,EAAe;;AAEvC;AACA,qBAAIyT,uBAAuBje,MAAMU,QAAN,CAAewd,4BAAf,EAA3B;;AAEA,qBAAID,oBAAJ,EAA0B;AACtBzT,+BAAMyQ,cAAN;;AAEA;;;;AAIAjb,+BAAMY,KAAN,CAAYmS,UAAZ,GAAyB,CAAC,CAA1B;;AAEA/S,+BAAMU,QAAN,CAAeyd,mBAAf;AACA;AACH;;AAED,qBAAI3T,MAAMpG,MAAN,CAAaga,eAAb,IAAgC,MAApC,EAA4C;;AAExC;AACApe,+BAAMY,KAAN,CAAYyd,qBAAZ;AACH;;AAED,qBAAI,CAACre,MAAMO,OAAN,CAAcsP,WAAnB,EAAgC;AAC5B;;;AAGA7P,+BAAMU,QAAN,CAAeyd,mBAAf,CAAmC3T,KAAnC;AACA;AACH;;AAGD,qBAAIiH,oBAA0BzR,MAAMY,KAAN,CAAY8Q,oBAAZ,MAAsC,CAApE;AAAA,qBACI6C,cAA0BvU,MAAMO,OAAN,CAAcsP,WAD5C;AAAA,qBAEI1G,OAA0BoL,YAAY7F,OAAZ,CAAoBvF,IAFlD;AAAA,qBAGImV,0BAA0Bte,MAAMQ,OAAN,CAAcqV,MAAd,IACtB7V,MAAMQ,OAAN,CAAcsV,OADQ,IAEtBtL,MAAMpG,MAAN,IAAgBpE,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,iBAAnB,CALxB;;AAOA;AACA,qBAAI8M,mBAAmBve,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBoV,gBAAzC;;AAEA;AACA,qBAAIvK,iBAAiB,WAArB;;AAEA;;;AAGA,qBAAKsK,uBAAL,EAA+B;;AAE3B9T,+BAAMyQ,cAAN;;AAEAjb,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBqK,WAAtB,CAAkCxB,KAAlC;;AAEAxK,+BAAMQ,OAAN,CAAcuV,KAAd;;AAEA;AAEH;;AAED;;;AAGA,qBAAKvL,MAAMgU,QAAN,IAAkB,CAACD,gBAAxB,EAA0C;AACtCve,+BAAMU,QAAN,CAAeyd,mBAAf,CAAmCne,MAAMO,OAAN,CAAcgT,YAAjD,EAA+D/I,KAA/D;AACAA,+BAAMyQ,cAAN;AAEH,kBAJD,MAIO,IAAMzQ,MAAMgU,QAAN,IAAkB,CAACD,gBAApB,IAA0C,CAAC/T,MAAMgU,QAAP,IAAmBD,gBAAlE,EAAqF;AACxF;AACA;AACH;;AAED,qBAAIE,iBAAiB,KAArB;AAAA,qBACIC,mBAAmB1a,OAAOiM,YAAP,EADvB;AAAA,qBAEI0O,sBAAsBD,iBAAiBvO,UAF3C;AAAA,qBAGIyO,sBAAsB5e,MAAMY,KAAN,CAAY2R,QAAZ,CAAqBsM,QAArB,EAH1B;AAAA,qBAIIC,4CAA4C,KAJhD;;AAMA;;;;;AAKAA,6DAA4CH,uBAAuBA,oBAAoBra,UAApB,CAA+B8Z,eAA/B,IAAkD,MAArH;;AAEA;;;AAGA,qBACIO,oBAAoB7Y,QAApB,IAAgC9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAArD,IACA,CAACma,yCADD,IAEA,CAACF,mBAHL,EAIC;;AAEGpU,+BAAMyQ,cAAN;;AAEAjb,+BAAME,IAAN,CAAWkD,GAAX,CAAe,wBAAf;;AAEApD,+BAAMO,OAAN,CAAcuS,UAAd,CAAyBrB,iBAAzB;;AAEA;AACA,6BAAI,CAACzR,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,oBAAoB,CAAvC,EAA0C7B,WAA1C,CAAsD6C,IAAtD,EAAL,EAAmE;AAC/DzS,uCAAMQ,OAAN,CAAcwR,cAAd;AACH;AAEJ,kBAjBD,MAiBO;;AAEH,6BAAK2M,uBAAuBA,oBAAoBra,UAAhD,EAA4D;;AAExDma,kDAAiB,CAACE,oBAAoBra,UAApB,CAA+BE,WAAjD;AAEH;;AAED,6BAAKia,kBAAkBG,mBAAvB,EAA6C;;AAEzCpU,uCAAMyQ,cAAN;;AAEAjb,uCAAME,IAAN,CAAWkD,GAAX,CAAe,kDAAf;;AAEApD,uCAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,+CAAQkQ,cADc;AAEtB9I,gDAAQlL,MAAMS,KAAN,CAAYuT,cAAZ,EAA4BpI,MAA5B;AAFc,kCAA1B,EAGG,IAHH;;AAKA5L,uCAAMQ,OAAN,CAAcuR,IAAd;AACA/R,uCAAMQ,OAAN,CAAcsG,IAAd;;AAEA;AACA9G,uCAAMQ,OAAN,CAAcwR,cAAd;AAEH,0BAjBD,MAiBO;;AAEHhS,uCAAME,IAAN,CAAWkD,GAAX,CAAe,yBAAf;AAEH;AAEJ;;AAED;AACApD,uBAAMG,EAAN,CAAS8C,UAAT;AAEH,UA9ID;;AAgJAya,mBAAUI,gBAAV,GAA6B,UAAStT,KAAT,EAAe;;AAExC;AACAxK,uBAAMQ,OAAN,CAAcuV,KAAd;;AAEA;AACA/V,uBAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;;AAEAvL,uBAAMyQ,cAAN;AAEH,UAVD;;AAYAyC,mBAAUM,eAAV,GAA4B,UAASxT,KAAT,EAAe;;AAEvCxK,uBAAMO,OAAN,CAAcwL,kBAAd;;AAEA;AACA/L,uBAAMQ,OAAN,CAAcuV,KAAd;AACA/V,uBAAMQ,OAAN,CAAcuR,IAAd;AAEH,UARD;;AAUA2L,mBAAUK,iBAAV,GAA8B,UAASvT,KAAT,EAAgB;;AAE1CxK,uBAAMQ,OAAN,CAAcuV,KAAd;;AAEA,qBAAI,CAAC/V,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBwM,aAA1B,EAAyC;AACrC7X,+BAAMQ,OAAN,CAAc6K,MAAd,CAAqB0K,KAArB;AACA/V,+BAAMO,OAAN,CAAcmQ,SAAd;AACH;AACJ,UARD;;AAUAgN,mBAAU/S,eAAV,GAA4B,UAAUH,KAAV,EAAiB;;AAEzC,qBAAIA,MAAMpG,MAAN,CAAa4K,SAAb,CAAuBC,QAAvB,CAAgC,mBAAhC,CAAJ,EAA0D;AAACzE,+BAAMpG,MAAN,CAAa2a,aAAb,CAA2BvU,KAA3B,EAAmC;AAAQ;;AAEtGxK,uBAAMO,OAAN,CAAcwL,kBAAd,CAAiCvB,MAAMpG,MAAvC;;AAEApE,uBAAMG,EAAN,CAAS8C,UAAT;;AAEA,qBAAI+U,eAAehY,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB4M,gBAArB,EAAnB;;AAEA;;;AAGA,qBAAID,aAAazL,MAAb,KAAwB,CAA5B,EAA+B;AAC3BvM,+BAAMQ,OAAN,CAAc6K,MAAd,CAAqB0K,KAArB;AACH;;AAED;AACA,qBAAIvL,MAAMpG,MAAN,CAAaga,eAAb,IAAgC,MAApC,EAA4C;;AAExCpe,+BAAMY,KAAN,CAAYyd,qBAAZ;AAEH;;AAED,qBAAIre,MAAMO,OAAN,CAAcsP,WAAd,KAA8B,IAAlC,EAAwC;;AAEpC;;;AAGA,6BAAImP,mBAAmBhf,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,GAA4B,CAA5B,GAAgCvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,GAA4B,CAA5D,GAAgE,CAAvF;;AAEA;AACA,6BAAIvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAvB,EAA+B;;AAE3B;AACA,qCAAI0S,kBAAmBjf,MAAMO,OAAN,CAAcqQ,kBAAd,CAAiC5Q,MAAMoC,KAAN,CAAYG,MAAZ,CAAmByc,gBAAnB,CAAjC,CAAvB;AACH;;AAED;AACA,6BAAIhf,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,IAA6BvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmByc,gBAAnB,EAAqCpP,WAArC,KAAqD,EAAlF,IAAwFqP,gBAAgBvQ,OAAhB,CAAwBvF,IAAxB,IAAgC,WAA5H,EAAyI;;AAErInJ,uCAAMY,KAAN,CAAY6c,UAAZ,CAAuBuB,gBAAvB;AAEH,0BAJD,MAIO;;AAEH;AACA,qCAAIhL,iBAAiB,WAArB;;AAEAhU,uCAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,+CAAQkQ,cADc;AAEtB9I,gDAAQlL,MAAMS,KAAN,CAAYuT,cAAZ,EAA4BpI,MAA5B;AAFc,kCAA1B;;AAKA;AACA,qCAAI5L,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,KAA8B,CAAlC,EAAqC;;AAEjCvM,+CAAMY,KAAN,CAAY6c,UAAZ,CAAuBuB,gBAAvB;AAEH,kCAJD,MAIO;;AAEH;AACAhf,+CAAMY,KAAN,CAAYsR,cAAZ,CAA2B8M,gBAA3B;AACH;AACJ;;AAED;;;AAGAhf,+BAAMQ,OAAN,CAAcuR,IAAd;;AAGA/R,+BAAMQ,OAAN,CAAcsG,IAAd;AAEH,kBAjDD,MAiDO;;AAEH;;;AAGA9G,+BAAMQ,OAAN,CAAcuR,IAAd;;AAEA/R,+BAAMQ,OAAN,CAAcsG,IAAd;;AAEA;AACA9G,+BAAMQ,OAAN,CAAcQ,QAAd,CAAuB+U,KAAvB;AACA/V,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;AACH;;AAGD,qBAAImJ,eAAe,CAAClf,MAAMO,OAAN,CAAcsP,WAAd,CAA0BD,WAA1B,CAAsC6C,IAAtC,EAApB;;AAEA,qBAAIyM,YAAJ,EAAkB;;AAEd;AACAlf,+BAAMQ,OAAN,CAAcwR,cAAd;AAEH,kBALD,MAKO;;AAEH;AACAhS,+BAAMQ,OAAN,CAAcyV,cAAd;AAEH;;AAED,qBAAIkJ,kBAAkBnf,MAAMO,OAAN,CAAcsP,WAAd,CAA0BnB,OAA1B,CAAkCvF,IAAxD;;AAEA;AACA,qBAAIgW,mBAAmB,WAAnB,IAAkC,CAACD,YAAvC,EAAqD;;AAEjDlf,+BAAMO,OAAN,CAAciQ,SAAd;AAEH;AAEJ,UA/GD;;AAiHA;;;;;;;AAOAkN,mBAAUQ,4BAAV,GAAyC,YAAW;;AAEhD,qBAAIlO,YAAahM,OAAOiM,YAAP,EAAjB;AAAA,qBACIE,aAAaH,UAAUG,UAD3B;AAAA,qBAEIiP,OAAO,KAFX;;AAKA,qBAAIpP,UAAUoK,UAAV,IAAwB,CAA5B,EAA+B;;AAE3B,gCAAO,IAAP;AAEH,kBAJD,MAIO;;AAEH,6BAAI,CAACpa,MAAME,IAAN,CAAW0F,SAAX,CAAqBuK,UAArB,CAAL,EAAuC;AACnCA,8CAAaA,WAAW7L,UAAxB;AACH;;AAED;AACA,6BAAI6L,WAAWiO,eAAX,IAA8B,MAAlC,EAA0C;AACtCgB,wCAAO,IAAP;AACH;;AAED,gCAAOjP,WAAWiO,eAAX,IAA8B,MAArC,EAA6C;AACzCjO,8CAAaA,WAAW7L,UAAxB;;AAEA,qCAAI6L,WAAWiO,eAAX,IAA8B,MAAlC,EAA0C;AACtCgB,gDAAO,IAAP;AACH;;AAED,qCAAIjP,cAAc1M,SAASiF,IAA3B,EAAiC;AAC7B;AACH;AACJ;;AAED;AACA,gCAAO0W,OAAO,KAAP,GAAe,IAAtB;AACH;AAEJ,UAtCD;;AAwCA;;;;AAIA1B,mBAAU1S,oBAAV,GAAiC,UAAUR,KAAV,EAAiB;;AAE9C,qBAAIO,SAAS,IAAb;;AAEA/K,uBAAMQ,OAAN,CAAcsV,OAAd,GAAwB/K,OAAO2D,OAAP,CAAe5K,IAAvC;;AAEA9D,uBAAMQ,OAAN,CAAcmB,OAAd,CAAsBqK,WAAtB,CAAkCxB,KAAlC;AACAxK,uBAAMQ,OAAN,CAAcuV,KAAd;AAEH,UATD;;AAWA2H,mBAAU5S,kBAAV,GAA+B,UAAUN,KAAV,EAAiB;;AAE5C;;;AAGA,qBAAI,KAAKmT,mBAAT,EAA6B;AACzB0B,sCAAa,KAAK1B,mBAAlB;AACH;;AAED;;;AAGA,sBAAKA,mBAAL,GAA2B1L,WAAW,YAAW;;AAE7CjS,+BAAMO,OAAN,CAAcuP,IAAd;AAEH,kBAJ0B,EAIxB,GAJwB,CAA3B;AAMH,UAlBD;;AAoBA;AACA4N,mBAAU9S,iBAAV,GAA8B,YAAW;;AAErC,qBAAI,CAAC5K,MAAMoB,KAAN,CAAYO,OAAZ,CAAoBqN,SAApB,CAA8BC,QAA9B,CAAuC,QAAvC,CAAL,EAAuD;;AAEnDjP,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBmF,IAAtB;AAEH,kBAJD,MAIO;;AAEH9G,+BAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;AAEH;AACJ,UAXD;;AAaA;;;AAGA2H,mBAAUvS,YAAV,GAAyB,UAASX,KAAT,EAAgBU,KAAhB,EAAuB;;AAE5C,yBAAQV,MAAM0Q,OAAd;;AAEI,8BAAKlb,MAAME,IAAN,CAAW2E,IAAX,CAAgBW,IAArB;AACA,8BAAKxF,MAAME,IAAN,CAAW2E,IAAX,CAAgBY,KAArB;AACIzF,uCAAMU,QAAN,CAAe4e,4BAAf,CAA4CpU,KAA5C;AACA;;AAEJ,8BAAKlL,MAAME,IAAN,CAAW2E,IAAX,CAAgBC,SAArB;AACI9E,uCAAMU,QAAN,CAAe6e,gBAAf,CAAgCrU,KAAhC;AACA;;AAEJ,8BAAKlL,MAAME,IAAN,CAAW2E,IAAX,CAAgBU,EAArB;AACA,8BAAKvF,MAAME,IAAN,CAAW2E,IAAX,CAAgBS,IAArB;AACItF,uCAAMU,QAAN,CAAe8e,yBAAf,CAAyCtU,KAAzC;AACA;;AAdR;AAiBH,UAnBD;;AAqBA;;;AAGAwS,mBAAU4B,4BAAV,GAAyC,UAAUpU,KAAV,EAAiB;;AAEtD,qBAAI8E,YAAchM,OAAOiM,YAAP,EAAlB;AAAA,qBACI1N,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,qBAEIkd,cAAczP,UAAUG,UAF5B;AAAA,qBAGIuP,iBAHJ;;AAKA;AACA,qBAAI,CAACD,WAAL,EAAiB;AACb,gCAAO,KAAP;AACH;;AAED;AACA,wBAAOA,YAAYrB,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CsB,6CAAoBD,YAAYnb,UAAhC;AACAmb,uCAAoBC,iBAApB;AACH;;AAED;AACA,qBAAIC,uBAAuB,CAA3B;AACA,wBAAOF,eAAeld,OAAOod,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;;AAIA,qBAAI,CAACF,YAAY7P,WAAjB,EACA;AACI5P,+BAAMY,KAAN,CAAYsR,cAAZ,CAA2ByN,oBAA3B;AACA;AACH;;AAED;;;AAGA,qBAAIC,mBAAsB,KAA1B;AAAA,qBACIhB,sBAAsB,KAD1B;;AAGA,qBAAIiB,SAAJ,EACIC,eADJ;;AAGAD,6BAAYJ,YAAYpR,UAAZ,CAAuBoR,YAAYpR,UAAZ,CAAuB9B,MAAvB,GAAgC,CAAvD,CAAZ;;AAEA,qBAAIvM,MAAME,IAAN,CAAW0F,SAAX,CAAqBia,SAArB,CAAJ,EAAqC;;AAEjCC,2CAAkB9f,MAAMO,OAAN,CAAc+R,8BAAd,CAA6CuN,SAA7C,EAAwDA,UAAUxR,UAAV,CAAqB9B,MAA7E,CAAlB;AAEH,kBAJD,MAIO;;AAEHuT,2CAAkBD,SAAlB;AAEH;;AAEDD,oCAAmB5P,UAAUG,UAAV,IAAwB2P,eAA3C;AACAlB,uCAAsBkB,gBAAgBvT,MAAhB,IAA0ByD,UAAUkD,YAA1D;;AAEA,qBAAK,CAAC0M,gBAAD,IAAsB,CAAChB,mBAA5B,EAAkD;AAC9C5e,+BAAME,IAAN,CAAWkD,GAAX,CAAe,qDAAf;AACA,gCAAO,KAAP;AACH;;AAEDpD,uBAAMY,KAAN,CAAYsR,cAAZ,CAA2ByN,oBAA3B;AAEH,UAlED;;AAoEA;;;AAGAjC,mBAAU8B,yBAAV,GAAsC,UAAUtU,KAAV,EAAiB;;AAEnD,qBAAI8E,YAAchM,OAAOiM,YAAP,EAAlB;AAAA,qBACI1N,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,qBAEIkd,cAAczP,UAAUG,UAF5B;AAAA,qBAGIuP,iBAHJ;;AAKA;AACA,qBAAI,CAACD,WAAL,EAAiB;AACb,gCAAO,KAAP;AACH;;AAED;;;AAGA,qBAAKzP,UAAUkD,YAAV,KAA2B,CAAhC,EAAmC;AAC/B,gCAAO,KAAP;AACH;;AAED;AACA,wBAAOuM,YAAYrB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CsB,6CAAoBD,YAAYnb,UAAhC;AACAmb,uCAAoBC,iBAApB;AACH;;AAED;AACA,qBAAIC,uBAAuB,CAA3B;AACA,wBAAOF,eAAeld,OAAOod,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;AAGA,qBAAII,oBAAsB,KAA1B;AAAA,qBACIC,sBAAsB,KAD1B;;AAGA,qBAAIC,UAAJ,EACIH,eADJ;;AAGA;;;;AAIA,qBAAI,CAACL,YAAY7P,WAAjB,EAA8B;AAC1B5P,+BAAMY,KAAN,CAAYsf,kBAAZ,CAA+BP,oBAA/B;AACA;AACH;;AAEDM,8BAAaR,YAAYpR,UAAZ,CAAuB,CAAvB,CAAb;;AAEA,qBAAIrO,MAAME,IAAN,CAAW0F,SAAX,CAAqBqa,UAArB,CAAJ,EAAsC;;AAElCH,2CAAkB9f,MAAMO,OAAN,CAAc+R,8BAAd,CAA6C2N,UAA7C,EAAyD,CAAzD,CAAlB;AAEH,kBAJD,MAIO;;AAEHH,2CAAkBG,UAAlB;AAEH;;AAEDF,qCAAsB/P,UAAUG,UAAV,IAAwB2P,eAA9C;AACAE,uCAAsBhQ,UAAUkD,YAAV,KAA2B,CAAjD;;AAEA,qBAAK6M,qBAAqBC,mBAA1B,EAAgD;;AAE5ChgB,+BAAMY,KAAN,CAAYsf,kBAAZ,CAA+BP,oBAA/B;AAEH;AAEJ,UAtED;;AAwEA;;;AAGAjC,mBAAUS,mBAAV,GAAgC,UAAU3T,KAAV,EAAiB;;AAE7C,qBAAIwJ,iBAAkB,WAAtB;;AAEAhU,uBAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,+BAAQkQ,cADc;AAEtB9I,gCAAQlL,MAAMS,KAAN,CAAYuT,cAAZ,EAA4BpI,MAA5B;AAFc,kBAA1B,EAGG,IAHH;;AAKA5L,uBAAMQ,OAAN,CAAcuR,IAAd;AACA/R,uBAAMQ,OAAN,CAAcsG,IAAd;AAEH,UAZD;;AAcA4W,mBAAU6B,gBAAV,GAA6B,UAAUrU,KAAV,EAAiB;;AAE1C,qBAAIuG,oBAAoBzR,MAAMY,KAAN,CAAY8Q,oBAAZ,EAAxB;AAAA,qBACIqI,KADJ;AAAA,qBAEIoG,eAFJ;AAAA,qBAGIxI,qBAHJ;;AAKA,qBAAIzM,MAAM0E,WAAN,CAAkB6C,IAAlB,EAAJ,EAA8B;;AAE1BsH,iCAAkB/Z,MAAMO,OAAN,CAAcqS,QAAd,EAAlB;AACAuN,2CAAkBpG,MAAMqG,SAAN,GAAkBrG,MAAM+B,WAA1C;;AAGA,6BAAI9b,MAAMY,KAAN,CAAY2R,QAAZ,CAAqB8N,OAArB,MAAkC,CAACF,eAAnC,IAAsDngB,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,oBAAoB,CAAvC,CAA1D,EAAqG;;AAEjGzR,uCAAMO,OAAN,CAAc0T,WAAd,CAA0BxC,iBAA1B;AAEH,0BAJD,MAIO;;AAEH;AAEH;AACJ;;AAED,qBAAI,CAAC0O,eAAL,EAAsB;AAClBjV,+BAAMyF,MAAN;AACH;;AAGDgH,yCAAwB3X,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBkM,UAArB,CAAgC9B,MAAxD;;AAEA;;;AAGA,qBAAIoL,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA3X,+BAAMO,OAAN,CAAcsP,WAAd,GAA4B,IAA5B;;AAEA;AACA7P,+BAAMG,EAAN,CAASsL,eAAT;;AAEA;AACAzL,+BAAMG,EAAN,CAAS8C,UAAT;;AAEA;AACAgP,oCAAW,YAAY;;AAEnBjS,uCAAMY,KAAN,CAAYsf,kBAAZ,CAA+B,CAA/B;AAEH,0BAJD,EAIG,EAJH;AAMH,kBAlBD,MAkBO;;AAEH,6BAAIlgB,MAAMY,KAAN,CAAYmS,UAAZ,KAA2B,CAA/B,EAAkC;;AAE9B;AACA/S,uCAAMY,KAAN,CAAYsf,kBAAZ,CAA+BlgB,MAAMY,KAAN,CAAYmS,UAA3C;AAEH,0BALD,MAKO;;AAEH;AACA/S,uCAAMY,KAAN,CAAYsR,cAAZ,CAA2BlS,MAAMY,KAAN,CAAYmS,UAAvC;AAEH;AACJ;;AAED/S,uBAAMQ,OAAN,CAAcuR,IAAd;;AAEA,qBAAI,CAAC/R,MAAMQ,OAAN,CAAcqV,MAAnB,EAA2B;AACvB7V,+BAAMQ,OAAN,CAAcsG,IAAd;AACH;;AAED;AACA9G,uBAAMG,EAAN,CAAS8C,UAAT;;AAEA;AACAuH,uBAAMyQ,cAAN;AAEH,UA/ED;;AAiFAyC,mBAAUtS,UAAV,GAAuB,UAASZ,KAAT,EAAgB;;AAEnC,qBAAIiH,oBAAoBzR,MAAMY,KAAN,CAAY8Q,oBAAZ,EAAxB;AAAA,qBACIb,OAAO7Q,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,iBAAnB,CADX;;AAGAQ,4BAAW,YAAW;;AAElBjS,+BAAMO,OAAN,CAAckU,QAAd,CAAuB5D,IAAvB;AAEH,kBAJD,EAIG,EAJH;AAMH,UAXD;;AAaA6M,mBAAU4C,WAAV,GAAwB,UAAS9V,KAAT,EAAgB;;AAEpC,qBAAIiH,oBAAoBzR,MAAMY,KAAN,CAAY8Q,oBAAZ,EAAxB;;AAEA;;;AAGA,qBAAI6O,WAAW,IAAIC,gBAAJ,CAAqBxgB,MAAMU,QAAN,CAAe+f,iBAApC,CAAf;;AAEA;;;AAGA,qBAAIC,SAAS,EAAElL,YAAY,IAAd,EAAoBmL,WAAW,IAA/B,EAAqCC,eAAe,KAApD,EAAb;;AAEA;AACAL,0BAASM,OAAT,CAAiB7gB,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkP,iBAAnB,CAAjB,EAAwDiP,MAAxD;AACH,UAhBD;;AAkBA;;;AAGAhD,mBAAU+C,iBAAV,GAA8B,UAASK,SAAT,EAAoB;AAC9CA,2BAAU3H,OAAV,CAAkBnZ,MAAMO,OAAN,CAAc8T,KAAhC;AACH,UAFD;;AAIA;;;AAGAqJ,mBAAU7S,yBAAV,GAAsC,YAAU;;AAE5C;;;;;;AAMA,qBAAIkW,kBAAkB/gB,MAAMO,OAAN,CAAcsP,WAAd,CAA0BnB,OAA1B,CAAkCvF,IAAxD;;AAEAnJ,uBAAMQ,OAAN,CAAcQ,QAAd,CAAuBgV,MAAvB,CAA8B+K,eAA9B;;AAEA;AACA/gB,uBAAMQ,OAAN,CAAcmB,OAAd,CAAsBoU,KAAtB;AACA/V,uBAAMQ,OAAN,CAAcQ,QAAd,CAAuB0V,iBAAvB;AAEH,UAhBD;;AAkBAgH,mBAAUsD,mBAAV,GAAgC,UAAS9c,CAAT,EAAY;;AAExC,qBAAI+H,QAAa/H,EAAE+c,IAAF,CAAO,CAAP,CAAjB;AAAA,qBACI3f,UAAa4C,EAAE+c,IAAF,CAAO,CAAP,CADjB;AAAA,qBAEIC,aAAalhB,MAAMW,IAAN,CAAWwgB,iBAAX,EAFjB;;AAIA,qBAAIlV,MAAMmP,KAAN,CAAY3I,IAAZ,MAAsB,EAA1B,EAA8B;;AAE1B,6BAAI,CAACnR,QAAQgO,aAAR,CAAsB,0BAAtB,CAAL,EACIhO,QAAQwG,WAAR,CAAoBoZ,UAApB;AAEP,kBALD,MAKO;;AAEH,6BAAInW,SAASzJ,QAAQgO,aAAR,CAAsB,0BAAtB,CAAb;AACA,6BAAIvE,MAAJ,EACIzJ,QAAQoR,WAAR,CAAoB3H,MAApB;AAEP;AAEJ,UAnBD;;AAqBA2S,mBAAU0D,cAAV,GAA2B,UAASld,CAAT,EAAY;;AAEnC,qBAAIE,SAAmBF,EAAEE,MAAzB;AAAA,qBACIqL,YAAmBrL,OAAOsK,OAAP,CAAee,SADtC;AAAA,qBAEI4R,mBAAmBrhB,MAAMe,QAAN,CAAeugB,uBAAf,CAAuC7R,SAAvC,CAFvB;AAAA,qBAGIzF,UAAmBhK,MAAMe,QAAN,CAAewgB,cAAf,CAA8B9R,SAA9B,CAHvB;;AAKA,qBAAI,CAAC4R,gBAAD,IAAqB,CAACrX,OAA1B,EAAmC;;AAEnCqX,kCAAiBrS,SAAjB,CAA2ByB,GAA3B,CAA+B,8BAA/B;AACAzG,yBAAQgF,SAAR,CAAkByB,GAAlB,CAAsB,2BAAtB;AAEH,UAZD;;AAcAiN,mBAAU8D,aAAV,GAA0B,UAAStd,CAAT,EAAY;;AAElC,qBAAIE,SAAmBF,EAAEE,MAAzB;AAAA,qBACIqL,YAAmBrL,OAAOsK,OAAP,CAAee,SADtC;AAAA,qBAEI4R,mBAAmBrhB,MAAMe,QAAN,CAAeugB,uBAAf,CAAuC7R,SAAvC,CAFvB;AAAA,qBAGIzF,UAAmBhK,MAAMe,QAAN,CAAewgB,cAAf,CAA8B9R,SAA9B,CAHvB;;AAKA,qBAAI,CAAC4R,gBAAD,IAAqB,CAACrX,OAA1B,EAAmC;;AAEnCqX,kCAAiBrS,SAAjB,CAA2B2B,MAA3B,CAAkC,8BAAlC;AACA3G,yBAAQgF,SAAR,CAAkB2B,MAAlB,CAAyB,2BAAzB;AAEH,UAZD;;AAcA+M,mBAAU+D,wBAAV,GAAqC,UAASvd,CAAT,EAAY;;AAE7C,qBAAIgd,aAAchd,EAAE+c,IAAF,CAAO,CAAP,CAAlB;AAAA,qBACI3f,UAAc4C,EAAE+c,IAAF,CAAO,CAAP,CADlB;;AAGAjhB,uBAAMe,QAAN,CAAeqG,IAAf,CAAoB9F,OAApB,EAA6B4f,UAA7B;AAEH,UAPD;;AASAxD,mBAAUgE,0BAAV,GAAuC,UAASxd,CAAT,EAAY;;AAE/C,qBAAI5C,UAAU4C,EAAE+c,IAAF,CAAO,CAAP,CAAd;;AAEAjhB,uBAAMe,QAAN,CAAe4gB,MAAf,CAAsBrgB,OAAtB;AAEH,UAND;;AAQAoc,mBAAUkE,wBAAV,GAAqC,UAAS1d,CAAT,EAAY;;AAE7C,qBAAI5C,UAAgB4C,EAAE+c,IAAF,CAAO,CAAP,CAApB;AAAA,qBACIY,gBAAgB3d,EAAE+c,IAAF,CAAO,CAAP,CADpB;;AAGAjhB,uBAAMe,QAAN,CAAe+gB,IAAf,CAAoBxgB,OAApB,EAA6BugB,aAA7B;AAEH,UAPD;;AASA,gBAAOnE,SAAP;AAEH,EA9zBe,CA8zBb,EA9zBa,CAAhB;;AAg0BA5d,QAAOC,OAAP,GAAkB2d,SAAlB,C;;;;;;;;ACh0BA,KAAI/c,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;AAGAA,cAAKW,OAAL,GAAe,YAAY;;AAEvB,qBAAIA,UAAUmC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAnG,yBAAQyG,SAAR,IAAqB,cAArB;;AAEA,wBAAOzG,OAAP;AAEH,UARD;;AAUAX,cAAKY,YAAL,GAAoB,YAAW;;AAE1B,wBAAOZ,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,kBAAjB,CAAP;AAEJ,UAJD;;AAMA;;;AAGAlQ,cAAKwB,QAAL,GAAgB,YAAY;;AAExB,qBAAIA,WAAWsB,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEAtF,0BAAS4F,SAAT,IAAsB,aAAtB;;AAEA,wBAAO5F,QAAP;AAEH,UARD;;AAUAxB,cAAK4H,OAAL,GAAe,YAAW;;AAEtB,qBAAI2C,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,uBAAMnD,SAAN,IAAmB,UAAnB;;AAEA,wBAAOmD,KAAP;AAEH,UARD;;AAUA;;;AAGAvK,cAAKH,OAAL,GAAe,YAAY;;AAEvB,qBAAIuhB,MAAMte,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAsa,qBAAIha,SAAJ,IAAiB,YAAjB;;AAEA,wBAAOga,GAAP;AACH,UAPD;;AASAphB,cAAK2H,cAAL,GAAsB,YAAW;;AAE7B,qBAAIhH,UAAUmC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;AACAnG,yBAAQ0N,SAAR,CAAkByB,GAAlB,CAAsB,qBAAtB;;AAEA,wBAAOnP,OAAP;AACH,UAND;;AAQA;;;AAGAX,cAAKa,aAAL,GAAqB,YAAW;;AAE5B,qBAAIugB,MAAMte,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAsa,qBAAIha,SAAJ,IAAiB,mBAAjB;;AAEA,wBAAOga,GAAP;AAEH,UARD;;AAUA;;;AAGAphB,cAAKsI,oBAAL,GAA4B,YAAW;;AAEnC,qBAAI3H,UAAUmC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAnG,yBAAQyG,SAAR,IAAqB,4BAArB;;AAEA,wBAAOzG,OAAP;AACH,UAPD;;AASA;;;AAGAX,cAAKuI,oBAAL,GAA4B,YAAW;;AAEnC,qBAAI5H,UAAUmC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAnG,yBAAQyG,SAAR,IAAqB,4BAArB;;AAEA,wBAAOzG,OAAP;AAEH,UARD;;AAUAX,cAAKoa,YAAL,GAAoB,YAAW;;AAE3B,qBAAI9O,QAAQxI,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEAwE,uBAAMnI,IAAN,GAAoB,OAApB;AACAmI,uBAAMlE,SAAN,IAAoB,cAApB;AACAkE,uBAAM+V,WAAN,GAAoB,cAApB;AACA/V,uBAAMJ,YAAN,CAAmB,MAAnB,EAA2B,aAA3B;;AAEAI,uBAAMJ,YAAN,CAAmB,WAAnB,EAAgC,WAAhC;;AAEA,wBAAOI,KAAP;AAEH,UAbD;;AAeA;;;AAGAtL,cAAK8H,YAAL,GAAoB,YAAW;;AAE3B,qBAAIyC,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,uBAAM8D,SAAN,CAAgByB,GAAhB,CAAoB,wBAApB;;AAEA,wBAAOvF,KAAP;AAEH,UARD;;AAUA;;;AAGAvK,cAAK6H,YAAL,GAAoB,YAAW;;AAE3B,qBAAI0C,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,uBAAMnD,SAAN,IAAmB,qBAAnB;;AAEA,wBAAOmD,KAAP;AACH,UAPD;;AASA;;;AAGAvK,cAAKoB,aAAL,GAAqB,YAAY;;AAE7B,qBAAIf,WAAWyC,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEAzG,0BAAS+G,SAAT,IAAsB,aAAtB;;AAEA,wBAAO/G,QAAP;AACH,UAPD;;AASAL,cAAKsB,eAAL,GAAuB,YAAW;;AAE9B,qBAAIggB,MAAMxe,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAwa,qBAAIjT,SAAJ,CAAcyB,GAAd,CAAkB,qBAAlB;;AAEA,wBAAOwR,GAAP;AACH,UAPD,EASAthB,KAAKkI,eAAL,GAAuB,YAAW;;AAE9B,qBAAIoZ,MAAMxe,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAwa,qBAAIjT,SAAJ,CAAcyB,GAAd,CAAkB,oBAAlB;;AAEA,wBAAOwR,GAAP;AAEH,UAjBD;;AAmBAthB,cAAKiB,UAAL,GAAkB,YAAW;;AAEzB,qBAAImJ,SAAStH,SAASgE,aAAT,CAAuB,MAAvB,CAAb;;AAEAsD,wBAAOhD,SAAP,GAAmB,kBAAnB;AACA;;AAEA,wBAAOgD,MAAP;AACH,UARD;;AAUA;;;AAGApK,cAAKgI,cAAL,GAAsB,YAAY;;AAE9B,qBAAIuZ,UAAUze,SAASgE,aAAT,CAAuB,MAAvB,CAAd;;AAEAya,yBAAQna,SAAR,GAAoB,0BAApB;;AAEA;AACAma,yBAAQ9T,SAAR,GAAoB,6BAApB;;AAEA,wBAAO8T,OAAP;AACH,UAVD;;AAYAvhB,cAAKkhB,aAAL,GAAqB,UAASja,EAAT,EAAa;;AAE9B,qBAAIua,QAAQxhB,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,mBAAjB,CAAZ;;AAEAsR,uBAAMzT,OAAN,CAAc9G,EAAd,GAAmBA,EAAnB;;AAEA,wBAAOua,KAAP;AAEH,UARD;;AAUAxhB,cAAKyhB,YAAL,GAAoB,UAAS/S,IAAT,EAAe;;AAE/B,qBAAI/N,UAAUX,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,qBAAjB,CAAd;AAAA,qBACI5E,QAAUtL,KAAKkQ,IAAL,CAAU,UAAV,EAAsB,mBAAtB,EAA2C,EAACmR,aAAa,aAAd,EAA3C,CADd;;AAGA,qBAAI3S,IAAJ,EAAUpD,MAAMmP,KAAN,GAAc/L,IAAd;;AAEVpD,uBAAM7B,gBAAN,CAAuB,OAAvB,EAAgCpK,MAAMU,QAAN,CAAesgB,mBAA/C;AACA1f,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe0gB,cAAtD;AACA9f,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe8gB,aAAtD;;AAEAlgB,yBAAQwG,WAAR,CAAoBmE,KAApB;;AAEA,wBAAO3K,OAAP;AAEH,UAfD;;AAiBAX,cAAK0gB,gBAAL,GAAwB,YAAW;;AAE/B,qBAAI/f,UAAUX,KAAKkQ,IAAL,CAAU,MAAV,EAAkB,wBAAlB,EAA4C,EAA5C,CAAd;;AAEAvP,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe0gB,cAAtD;AACA9f,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe8gB,aAAtD;;AAEA,wBAAOlgB,OAAP;AAEH,UATD;;AAWAX,cAAKwgB,iBAAL,GAAyB,YAAW;;AAEhC,qBAAIpW,SAASpK,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,yBAAjB,EAA4C,EAACjB,aAAa,SAAd,EAA5C,CAAb;;AAEA7E,wBAAOX,gBAAP,CAAwB,OAAxB,EAAiCpK,MAAMU,QAAN,CAAe+gB,wBAAhD;;AAEA,wBAAO1W,MAAP;AAEH,UARD;;AAUApK,cAAK0hB,mBAAL,GAA2B,YAAW;;AAElC,qBAAItX,SAASpK,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,2BAAjB,EAA8C,EAACjB,aAAa,QAAd,EAA9C,CAAb;;AAEA7E,wBAAOX,gBAAP,CAAwB,OAAxB,EAAiCpK,MAAMU,QAAN,CAAeghB,0BAAhD;;AAEA,wBAAO3W,MAAP;AAEH,UARD;;AAUApK,cAAK2hB,iBAAL,GAAyB,YAAW;;AAEhC,qBAAIvX,SAASpK,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,yBAAjB,EAA4C,EAACjB,aAAa,MAAd,EAA5C,CAAb;;AAEA7E,wBAAOX,gBAAP,CAAwB,OAAxB,EAAiCpK,MAAMU,QAAN,CAAekhB,wBAAhD;;AAEA,wBAAO7W,MAAP;AAEH,UARD;;AAUApK,cAAK4hB,aAAL,GAAqB,UAASC,MAAT,EAAiBnT,IAAjB,EAAuB;;AAExC,qBAAImT,SAASA,SAAS,SAAT,GAAoB,EAAjC;AAAA,qBACInT,OAAOA,QAAQmT,SAAS,IAAIzU,IAAJ,GAAW0U,kBAAX,CAA8B,OAA9B,EAAsC;AACFC,gCAAO,OADL;AAEFC,8BAAK,SAFH;AAGFC,+BAAM,SAHJ;AAIFC,iCAAQ,SAJN;AAKFC,iCAAQ;AALN,kBAAtC,CAD5B;;AAUA,wBAAOniB,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,kBAAjB,EAAqC,EAACjB,aAAaP,IAAd,EAArC,CAAP;AAEH,UAdD;;AAgBA1O,cAAKoiB,WAAL,GAAmB,UAAS1T,IAAT,EAAe;;AAE9B,wBAAO1O,KAAKkQ,IAAL,CAAU,KAAV,EAAiB,kBAAjB,EAAqC,EAACjB,aAAaP,IAAd,EAArC,CAAP;AAEH,UAJD;;AAMA;;;;AAIA1O,cAAKgB,OAAL,GAAe,YAAW;;AAEtB,qBAAIL,UAAUmC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAnG,yBAAQyG,SAAR,GAAoB,mBAApB;;AAEA,wBAAOzG,OAAP;AACH,UAPD;;AASA;;;;;;;;;AASAX,cAAK6I,aAAL,GAAqB,UAAU1F,IAAV,EAAgBkf,SAAhB,EAA2B;;AAE5C,qBAAIjY,SAAatH,SAASgE,aAAT,CAAuB,IAAvB,CAAjB;AAAA,qBACIwb,YAAaxf,SAASgE,aAAT,CAAuB,GAAvB,CADjB;AAAA,qBAEIyb,aAAazf,SAASgE,aAAT,CAAuB,MAAvB,CAFjB;;AAIAsD,wBAAO2D,OAAP,CAAe5K,IAAf,GAAsBA,IAAtB;AACAiH,wBAAOc,YAAP,CAAoB,OAApB,EAA6B/H,IAA7B;;AAEAmf,2BAAUjU,SAAV,CAAoByB,GAApB,CAAwBuS,SAAxB;AACAE,4BAAWlU,SAAX,CAAqByB,GAArB,CAAyB,yBAAzB;;AAGA1F,wBAAOjD,WAAP,CAAmBmb,SAAnB;AACAlY,wBAAOjD,WAAP,CAAmBob,UAAnB;;AAEA,wBAAOnY,MAAP;AAEH,UAlBD;;AAoBA;;;;;;;;AAQApK,cAAKuJ,mBAAL,GAA2B,UAASpG,IAAT,EAAekf,SAAf,EAA0B;AACjD,qBAAIjY,SAAatH,SAASgE,aAAT,CAAuB,QAAvB,CAAjB;AAAA,qBACIwb,YAAaxf,SAASgE,aAAT,CAAuB,GAAvB,CADjB;;AAGAsD,wBAAOjH,IAAP,GAAc,QAAd;AACAiH,wBAAO2D,OAAP,CAAe5K,IAAf,GAAsBA,IAAtB;AACAmf,2BAAUjU,SAAV,CAAoByB,GAApB,CAAwBuS,SAAxB;;AAEAjY,wBAAOjD,WAAP,CAAmBmb,SAAnB;;AAEA,wBAAOlY,MAAP;AACH,UAXD;;AAaA;;;AAGApK,cAAKuK,KAAL,GAAa,UAAUkK,OAAV,EAAmB7U,OAAnB,EAA4B;;AAErC,qBAAIsQ,OAAOpN,SAASgE,aAAT,CAAuB2N,OAAvB,CAAX;;AAEAvE,sBAAKzC,SAAL,GAAiB7N,WAAW,EAA5B;;AAEA,wBAAOsQ,IAAP;AAEH,UARD;;AAUA;;;;;;AAMAlQ,cAAKkQ,IAAL,GAAY,UAAUuE,OAAV,EAAoBrN,SAApB,EAAgCob,UAAhC,EAA4C;;AAEpD,qBAAItd,KAAKpC,SAASgE,aAAT,CAAwB2N,OAAxB,CAAT;;AAEA,qBAAKrN,SAAL,EAAiBlC,GAAGkC,SAAH,GAAeA,SAAf;;AAEjB,qBAAKob,UAAL,EAAkB;;AAEd,8BAAK,IAAI9Z,IAAT,IAAiB8Z,UAAjB,EAA4B;AACxBtd,oCAAGwD,IAAH,IAAW8Z,WAAW9Z,IAAX,CAAX;AACH;AACJ;;AAED,wBAAOxD,EAAP;AACH,UAdD;;AAgBAlF,cAAKyiB,aAAL,GAAqB,UAAStf,IAAT,EAAevD,OAAf,EAAwB;;AAEzC,wBAAO;AACHuD,+BAAQA,IADL;AAEHoH,gCAAQmY,QAAQ5iB,KAAR,CAAcqD,IAAd,EAAoB8H,MAApB,CAA2B;AAC/ByD,uCAAO9O;AADwB,0BAA3B;AAFL,kBAAP;AAMH,UARD;;AAUA,gBAAOI,IAAP;AAEH,EA9YU,CA8YR,EA9YQ,CAAX;;AAgZAb,QAAOC,OAAP,GAAiBY,IAAjB,C;;;;;;;;AChZA,KAAIC,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;AAGAA,WAAMmS,UAAN,GAAmB,IAAnB;;AAEA;;;AAGAnS,WAAMyY,MAAN,GAAe,IAAf;;AAEA;;;AAGAzY,WAAM0iB,gBAAN,GAAyB,IAAzB;;AAEA;;;;;;AAMA1iB,WAAMkR,GAAN,GAAY,UAAUjM,EAAV,EAAewH,KAAf,EAAsBgM,MAAtB,EAA8B;;AAEtCA,kBAASA,UAAU,KAAKA,MAAf,IAAyB,CAAlC;AACAhM,iBAASA,SAAU,KAAKiW,gBAAf,IAAmC,CAA5C;;AAEA,aAAIC,SAAS1d,GAAGwI,UAAhB;AAAA,aACImV,SADJ;;AAGA,aAAKD,OAAOhX,MAAP,KAAkB,CAAvB,EAA2B;;AAEvBiX,yBAAY3d,EAAZ;AAEH,UAJD,MAIO;;AAEH2d,yBAAYD,OAAOlW,KAAP,CAAZ;AAEH;;AAED;AACA,aAAIxH,GAAGuP,OAAH,IAAc,OAAlB,EAA2B;AACvBvP,gBAAGmV,KAAH;AACA;AACH;;AAED,aAAIhb,MAAME,IAAN,CAAW0F,SAAX,CAAqB4d,SAArB,CAAJ,EAAqC;;AAEjCA,yBAAYxjB,MAAMO,OAAN,CAAc+R,8BAAd,CAA6CkR,SAA7C,EAAwDA,UAAUnV,UAAV,CAAqB9B,MAA7E,CAAZ;AACH;;AAED,aAAIwN,QAAYtW,SAASuW,WAAT,EAAhB;AAAA,aACIhK,YAAYhM,OAAOiM,YAAP,EADhB;;AAGAgC,oBAAW,YAAW;;AAElB8H,mBAAMmC,QAAN,CAAesH,SAAf,EAA0BnK,MAA1B;AACAU,mBAAM6B,MAAN,CAAa4H,SAAb,EAAwBnK,MAAxB;;AAEArJ,uBAAUwM,eAAV;AACAxM,uBAAUyM,QAAV,CAAmB1C,KAAnB;;AAEA/Z,mBAAMY,KAAN,CAAYyd,qBAAZ;AAEH,UAVD,EAUG,EAVH;AAWH,MA3CD;;AA6CA;;;;AAIAzd,WAAMyd,qBAAN,GAA8B,YAAY;;AAEtC;AACA,aAAIrO,YAAchM,OAAOiM,YAAP,EAAlB;AAAA,aACI1N,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,aAEIkd,cAAczP,UAAUG,UAF5B;AAAA,aAGIuP,iBAHJ;;AAKA,aAAI,CAACD,WAAL,EAAiB;AACb;AACH;;AAED;AACA,gBAAOA,YAAYrB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CsB,iCAAoBD,YAAYnb,UAAhC;AACAmb,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAeld,OAAOod,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED,cAAK5M,UAAL,GAAkB4M,oBAAlB;AACH,MA1BD;;AA4BA;;;AAGA/e,WAAM8Q,oBAAN,GAA6B,YAAW;AACpC,gBAAO,KAAKqB,UAAZ;AACH,MAFD;;AAIA;;;AAGAnS,WAAMsR,cAAN,GAAuB,UAAS7E,KAAT,EAAgB;;AAEnC,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACIkhB,YAAYlhB,OAAO8K,QAAQ,CAAf,CADhB;;AAGA,aAAI,CAACoW,SAAL,EAAgB;AACZzjB,mBAAME,IAAN,CAAWkD,GAAX,CAAe,wBAAf;AACA;AACH;;AAED;;;;AAIA,aAAI,CAACqgB,UAAUpV,UAAV,CAAqB9B,MAA1B,EAAkC;AAC9B,iBAAImX,mBAAmBjgB,SAASoO,cAAT,CAAwB,EAAxB,CAAvB;AACA4R,uBAAU3b,WAAV,CAAsB4b,gBAAtB;AACH;;AAED1jB,eAAMY,KAAN,CAAYmS,UAAZ,GAAyB1F,QAAQ,CAAjC;AACArN,eAAMY,KAAN,CAAYkR,GAAZ,CAAgB2R,SAAhB,EAA2B,CAA3B,EAA8B,CAA9B;AACAzjB,eAAMO,OAAN,CAAcwL,kBAAd,CAAiC0X,SAAjC;AAEH,MAvBD;;AAyBA;;;;AAIA7iB,WAAM6c,UAAN,GAAmB,UAASpQ,KAAT,EAAgB;;AAE/B,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACI4R,cAAc5R,OAAO8K,KAAP,CADlB;;AAGApJ,iBAAQ0f,MAAR,CAAgBxP,WAAhB,EAA8B,gDAA9B;;AAEA,aAAK,CAACA,WAAN,EAAoB;AAChB;AACH;;AAED;;;;AAIA,aAAI,CAACA,YAAY9F,UAAZ,CAAuB9B,MAA5B,EAAoC;AAChC,iBAAImX,mBAAmBjgB,SAASoO,cAAT,CAAwB,EAAxB,CAAvB;AACAsC,yBAAYrM,WAAZ,CAAwB4b,gBAAxB;AACH;;AAED1jB,eAAMY,KAAN,CAAYmS,UAAZ,GAAyB1F,KAAzB;AACArN,eAAMY,KAAN,CAAYkR,GAAZ,CAAgBqC,WAAhB,EAA6B,CAA7B,EAAgC,CAAhC;AACAnU,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCoI,WAAjC;AAEH,MAxBD;;AA0BA;;;AAGAvT,WAAMsf,kBAAN,GAA2B,UAAS7S,KAAT,EAAgB;;AAEvCA,iBAAQA,SAAS,CAAjB;;AAEA,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACIqhB,gBAAgBrhB,OAAO8K,QAAQ,CAAf,CADpB;AAAA,aAEIwW,aAFJ;AAAA,aAGIC,qBAHJ;AAAA,aAIIJ,gBAJJ;;AAOA,aAAI,CAACE,aAAL,EAAoB;AAChB5jB,mBAAME,IAAN,CAAWkD,GAAX,CAAe,2BAAf;AACA;AACH;;AAEDygB,yBAAgB7jB,MAAMO,OAAN,CAAc+R,8BAAd,CAA6CsR,aAA7C,EAA4DA,cAAcvV,UAAd,CAAyB9B,MAArF,CAAhB;AACAuX,iCAAwBD,cAActX,MAAtC;;AAEA;;;;AAIA,aAAI,CAACqX,cAAcvV,UAAd,CAAyB9B,MAA9B,EAAsC;;AAElCmX,gCAAmBjgB,SAASoO,cAAT,CAAwB,EAAxB,CAAnB;AACA+R,2BAAc9b,WAAd,CAA0B4b,gBAA1B;AACH;AACD1jB,eAAMY,KAAN,CAAYmS,UAAZ,GAAyB1F,QAAQ,CAAjC;AACArN,eAAMY,KAAN,CAAYkR,GAAZ,CAAgB8R,aAAhB,EAA+BA,cAAcvV,UAAd,CAAyB9B,MAAzB,GAAkC,CAAjE,EAAoEuX,qBAApE;AACA9jB,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCxJ,OAAO8K,QAAQ,CAAf,CAAjC;AACH,MA/BD;;AAiCAzM,WAAM2R,QAAN,GAAiB;;AAEb8N,kBAAU,mBAAW;;AAEjB,iBAAIrQ,YAAkBhM,OAAOiM,YAAP,EAAtB;AAAA,iBACIiD,eAAkBlD,UAAUkD,YADhC;AAAA,iBAEI/C,aAAkBH,UAAUG,UAFhC;AAAA,iBAGI8O,kBAAkBjf,MAAMO,OAAN,CAAcqQ,kBAAd,CAAiCT,UAAjC,CAHtB;AAAA,iBAIIiT,gBAAkBnE,gBAAgB5Q,UAAhB,CAA2B,CAA3B,CAJtB;;AAMA,iBAAI,CAACrO,MAAME,IAAN,CAAW0F,SAAX,CAAqBuK,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAW7L,UAAxB;AACH;;AAED,iBAAIyf,cAAe5T,eAAeiT,cAAc/U,UAAd,CAAyB,CAAzB,CAAlC;AAAA,iBACI2V,eAAe9Q,iBAAiB,CADpC;;AAGA,oBAAO6Q,eAAeC,YAAtB;AAEH,UAnBY;;AAqBbnF,mBAAW,oBAAW;;AAElB,iBAAI7O,YAAehM,OAAOiM,YAAP,EAAnB;AAAA,iBACIiD,eAAelD,UAAUkD,YAD7B;AAAA,iBAEI/C,aAAeH,UAAUG,UAF7B;;AAIA;AACA,oBAAO,CAACA,UAAD,IAAe,CAACA,WAAW5D,MAA3B,IAAqC2G,iBAAiB/C,WAAW5D,MAAxE;AACH;AA7BY,MAAjB;;AAgCA,YAAO3L,KAAP;AAEH,EA3OW,CA2OT,EA3OS,CAAZ;;AA6OAd,QAAOC,OAAP,GAAiBa,KAAjB,C;;;;;;;;AC7OA,KAAIC,gBAAiB,UAASA,aAAT,EAAwB;;AAEzC;;;;AAIAA,mBAAc0J,WAAd,GAA4B,UAASF,QAAT,EAAmBG,KAAnB,EAA0B;;AAElDxK,eAAMa,aAAN,CAAoBuG,IAApB,CAAyB,wCAAzB,EAAmEoD,MAAM1G,IAAzE,EAA+E,KAA/E;AAEH,MAJD;;AAMA;;;;;;AAMAjD,mBAAcuG,IAAd,GAAqB,UAAS6c,OAAT,EAAkBngB,IAAlB,EAAwB8I,MAAxB,EAAgC;;AAEjD,aAAIsX,eAAelkB,MAAMW,IAAN,CAAWuK,KAAX,CAAiB,KAAjB,CAAnB;;AAEAgZ,sBAAatU,WAAb,GAA2BqU,OAA3B;AACAC,sBAAalV,SAAb,CAAuByB,GAAvB,CAA2B,sBAA3B,EAAmD,qBAAqB3M,IAAxE,EAA8E,SAA9E;;AAEA,aAAI,CAAC8I,MAAL,EAAa;AACT5M,mBAAMoB,KAAN,CAAYP,aAAZ,CAA0BuN,SAA1B,GAAsC,EAAtC;AACH;;AAEDpO,eAAMoB,KAAN,CAAYP,aAAZ,CAA0BiH,WAA1B,CAAsCoc,YAAtC;;AAEAjS,oBAAW,YAAY;AACnBiS,0BAAavT,MAAb;AACH,UAFD,EAEG,IAFH;AAIH,MAjBD;;AAmBA,YAAO9P,aAAP;AAEH,EAvCmB,CAuCjB,EAvCiB,CAApB;;AAyCAf,QAAOC,OAAP,GAAiBc,aAAjB,C;;;;;;;;ACzCA,KAAIC,SAAU,UAASA,MAAT,EAAiB;;AAE3B;;;AAGAA,YAAOqjB,2BAAP,GAAqC,UAAS5jB,OAAT,EAAkB;AACnD,gBAAOA,QAAQ6jB,KAAR,CAAc,IAAd,CAAP;AACH,MAFD;;AAIA;AACAtjB,YAAOujB,mBAAP,GAA6B,UAAS9jB,OAAT,EAAkB;;AAE3C,aAAI+B,SAAS,KAAK6hB,2BAAL,CAAiC5jB,OAAjC,CAAb;AAAA,aACIoM,CADJ;AAAA,aAEIoG,aAAasQ,QAAQziB,KAAR,CAAc8Q,oBAAd,EAFjB;AAAA,aAGIkD,QAHJ;AAAA,aAII0P,iBAJJ;;AAMA,cAAI3X,IAAI,CAAR,EAAWA,IAAIrK,OAAOiK,MAAtB,EAA8BI,GAA9B,EAAmC;;AAE/BrK,oBAAOqK,CAAP,EAAU8F,IAAV;;AAEA,iBAAInQ,OAAOqK,CAAP,CAAJ,EAAe;AACX,qBAAInJ,OAAO6f,QAAQ1iB,IAAR,CAAayiB,aAAb,CAA2B,WAA3B,EAAwC9gB,OAAOqK,CAAP,CAAxC,CAAX;AACA0W,yBAAQ9iB,OAAR,CAAgBuL,WAAhB,CAA4BtI,IAA5B;AACH;AACJ;AAEJ,MAlBD;;AAoBA;;;AAGA1C,YAAOyjB,oBAAP,GAA8B,YAAY;;AAEtC,aAAIC,iBAAiBnB,QAAQjiB,KAAR,CAAcC,QAAd,CAAuB+Z,KAA5C;;AAEA,aAAKoJ,eAAe/R,IAAf,GAAsBlG,MAAtB,KAAiC,CAAtC,EAA0C,OAAO,IAAP;;AAG1C8W,iBAAQviB;;AAER;AAFA,UAGK2jB,kBAHL,CAGwBD,cAHxB;;AAKI;AALJ,UAMK7hB,IANL,CAMU0gB,QAAQviB,MAAR,CAAe4jB,qBANzB;;AAQI;AARJ,UASKxhB,KATL,CASW,UAASC,KAAT,EAAgB;AACnBkgB,qBAAQnjB,IAAR,CAAakD,GAAb,CAAiB,iCAAjB,EAAoD,MAApD,EAA4DD,KAA5D;AACH,UAXL;AAaH,MApBD;;AAsBA;;;;;AAKArC,YAAO2jB,kBAAP,GAA4B,UAAUE,WAAV,EAAuB;;AAE/C,gBAAOthB,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,iBAAIiiB,gBAAgBnhB,SAASgE,aAAT,CAAuB,KAAvB,CAApB;;AAEAmd,2BAAcxW,SAAd,GAA0BuW,WAA1B;;AAEA;;;;;;AAMA,oBAAOC,cAAcvW,UAArB;AAEH,UAdM,CAAP;AAeH,MAjBD;;AAmBA;;;;AAIAvN,YAAO4jB,qBAAP,GAA+B,UAAStjB,KAAT,EAAgB;;AAE3C;;;;AAIA,aAAIgM,eAAe/J,QAAQC,OAAR,EAAnB;;AAGA,cAAK,IAAI+J,QAAQ,CAAjB,EAAoBA,QAAQjM,MAAMmL,MAAlC,EAA2Cc,OAA3C,EAAqD;;AAEjD;AACAgW,qBAAQviB,MAAR,CAAewM,iBAAf,CAAiCF,YAAjC,EAA+ChM,KAA/C,EAAsDiM,KAAtD;AAEH;AAEJ,MAhBD;;AAkBA;;;AAGAvM,YAAOwM,iBAAP,GAA2B,UAAUF,YAAV,EAAwBhM,KAAxB,EAA+BiM,KAA/B,EAAsC;;AAE7D;AACAD;;AAEA;AAFA,UAGKzK,IAHL,CAGU,YAAW;;AAEb,oBAAO0gB,QAAQviB,MAAR,CAAe2M,YAAf,CAA4BrM,KAA5B,EAAoCiM,KAApC,CAAP;AAEH,UAPL;;AASI;;;;AATJ,UAaK1K,IAbL,CAaU,UAASkO,IAAT,EAAc;;AAEhB,iBAAI3F,QAAQmY,QAAQviB,MAAR,CAAe+jB,oBAAf,CAAoChU,IAApC,CAAZ;;AAEA,iBAAKwS,QAAQnjB,IAAR,CAAa0F,SAAb,CAAuBsF,KAAvB,CAAL,EAAqC;;AAEjCA,uBAAMkT,eAAN,GAAwB,MAAxB;;AAEA;AACAlT,uBAAM8D,SAAN,CAAgByB,GAAhB,CAAoB,UAApB;;AAEA;AACA4S,yBAAQjiB,KAAR,CAAce,QAAd,CAAuB2F,WAAvB,CAAmCoD,KAAnC;;AAEA;AACAmY,yBAAQjhB,KAAR,CAAcE,MAAd,CAAqB4M,IAArB,CAA0BhE,KAA1B;;AAEA,wBAAOA,KAAP;AAEH;AACD,oBAAO,IAAP;AACH,UAlCL,EAoCKvI,IApCL,CAoCU0gB,QAAQljB,EAAR,CAAW8K,gBApCrB;;AAsCI;AAtCJ,UAuCK/H,KAvCL,CAuCW,UAASC,KAAT,EAAgB;AACnBkgB,qBAAQnjB,IAAR,CAAakD,GAAb,CAAiB,uCAAjB,EAA0D,MAA1D,EAAkED,KAAlE;AACH,UAzCL;AA2CH,MA9CD;;AAgDA;;;;AAIArC,YAAO2M,YAAP,GAAsB,UAAUqX,QAAV,EAAoBzX,KAApB,EAA2B;;AAE7C,gBAAOhK,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,oBAAOmiB,SAASC,IAAT,CAAc1X,KAAd,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;AASAvM,YAAO+jB,oBAAP,GAA8B,UAAUhU,IAAV,EAAgB;;AAE1C;AACA,aAAKwS,QAAQviB,MAAR,CAAewP,iBAAf,CAAiCO,IAAjC,CAAL,EAA6C;;AAEzC;AACAA,oBAAO,KAAKmU,cAAL,CAAoBnU,IAApB,CAAP;;AAEA,oBAAOA,IAAP;AACH;;AAED;AACA,aAAIoU,WAAJ;AAAA,aACIC,cAAkBrU,KAAKjB,WAAL,CAAiB6C,IAAjB,EADtB;AAAA,aAEI0S,kBAAkBtU,KAAK/K,QAAL,IAAiBud,QAAQnjB,IAAR,CAAauE,SAAb,CAAuBC,GAF9D;;AAKA;AACA,aAAIygB,mBAAmB,CAACD,YAAY3Y,MAApC,EAA4C,OAAO,IAAP;;AAE5C;AACA0Y,uBAAc5B,QAAQ1iB,IAAR,CAAauK,KAAb,CAAmB,GAAnB,CAAd;;AAEA,aAAIia,eAAJ,EAAoB;AAChBF,yBAAYrV,WAAZ,GAA0BsV,YAAY5P,OAAZ,CAAoB,UAApB,EAAgC,IAAhC,CAA1B,CADgB,CACiD;AACpE,UAFD,MAEO;AACH2P,yBAAYnd,WAAZ,CAAwB+I,IAAxB;AACH;;AAED;AACAoU,uBAAc,KAAKD,cAAL,CAAoBC,WAApB,CAAd;;AAEA,gBAAOA,WAAP;AAEH,MAlCD;;AAoCA;;;;;;;;;AASAnkB,YAAOkkB,cAAP,GAAwB,UAAUnU,IAAV,EAAgB;;AAEpC,iBAAQA,KAAKuE,OAAb;AACI,kBAAK,GAAL;AAAoBvE,sBAAKnC,OAAL,CAAavF,IAAb,GAAoB,WAApB,CAAiC;AACrD,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AAAoB0H,sBAAKnC,OAAL,CAAavF,IAAb,GAAoB,QAApB,CAA8B;AAClD,kBAAK,YAAL;AAAoB0H,sBAAKnC,OAAL,CAAavF,IAAb,GAAoB,OAApB,CAA6B;AACjD,kBAAK,MAAL;AAAoB0H,sBAAKnC,OAAL,CAAavF,IAAb,GAAoB,MAApB,CAA4B;AATpD;;AAYA,gBAAO0H,IAAP;AAEH,MAhBD;;AAkBA;;;AAGA/P,YAAOwP,iBAAP,GAA2B,UAAUO,IAAV,EAAgB;;AAEvC,gBAAOA,KAAK/K,QAAL,IAAiBud,QAAQnjB,IAAR,CAAauE,SAAb,CAAuBC,GAAxC,IACHmM,KAAK7B,SAAL,CAAeC,QAAf,CAAwBoU,QAAQljB,EAAR,CAAW4H,SAAX,CAAqBC,eAA7C,CADJ;AAGH,MALD;;AAOA,YAAOlH,MAAP;AAEH,EAzPY,CAyPV,EAzPU,CAAb;;AA2PAhB,QAAOC,OAAP,GAAiBe,MAAjB,C;;;;;;;;AC3PA,KAAIC,WAAW,UAASA,QAAT,EAAmB;;AAE9BA,kBAAS0P,GAAT,GAAe,UAASI,IAAT,EAAeb,SAAf,EAA0B;;AAErC,qBAAIR,UAAUqB,KAAKnC,OAAL,CAAa9G,EAA3B;AAAA,qBACIwa,eAAepiB,MAAMW,IAAN,CAAWyhB,YAAX,EADnB;AAAA,qBAEI3S,YAAY,CAAC,IAAI1B,IAAJ,EAFjB;AAAA,qBAGIqX,YAAYplB,MAAMW,IAAN,CAAW0gB,gBAAX,EAHhB;AAAA,qBAIItH,QAAQ/J,UAAU6C,UAAV,CAAqB,CAArB,CAJZ;;AAMAuP,8BAAa1T,OAAb,CAAqBc,OAArB,GAAsCA,OAAtC;AACA4S,8BAAa1T,OAAb,CAAqBe,SAArB,GAAsCA,SAAtC;AACA2S,8BAAa1T,OAAb,CAAqBgB,cAArB,GAAsCqK,MAAM+B,WAA5C;AACAsG,8BAAa1T,OAAb,CAAqBiB,YAArB,GAAsCoK,MAAMqG,SAA5C;;AAEAgF,2BAAU1W,OAAV,CAAkBe,SAAlB,GAAgCA,SAAhC;;AAEAsK,uBAAMsL,gBAAN,CAAuBD,SAAvB;;AAEAplB,uBAAMoB,KAAN,CAAYG,YAAZ,CAAyBuG,WAAzB,CAAqCsa,YAArC;AACAA,8BAAa9S,aAAb,CAA2B,oBAA3B,EAAiD0L,KAAjD;AACH,UAnBD;;AAqBAja,kBAASqG,IAAT,GAAgB,UAAS9F,OAAT,EAAkB4f,UAAlB,EAA8B;;AAE1C,qBAAIjV,QAAe3K,QAAQgO,aAAR,CAAsB,oBAAtB,CAAnB;AAAA,qBACIC,OAAevP,MAAMW,IAAN,CAAW4hB,aAAX,CAAyBjhB,QAAQoN,OAAR,CAAgB8T,MAAzC,CADnB;AAAA,qBAEInT,OAAerP,MAAMW,IAAN,CAAWoiB,WAAX,CAAuB9W,MAAMmP,KAA7B,CAFnB;AAAA,qBAGIkK,eAAetlB,MAAMW,IAAN,CAAW0hB,mBAAX,EAHnB;AAAA,qBAIIkD,aAAevlB,MAAMW,IAAN,CAAW2hB,iBAAX,EAJnB;;AAOAhhB,yBAAQ6P,YAAR,CAAqB9B,IAArB,EAA2BpD,KAA3B;AACA3K,yBAAQ6P,YAAR,CAAqB5B,IAArB,EAA2B2R,UAA3B;AACA5f,yBAAQwG,WAAR,CAAoBwd,YAApB;AACAhkB,yBAAQwG,WAAR,CAAoByd,UAApB;AAEH,UAdD;;AAgBAxkB,kBAAS+gB,IAAT,GAAgB,UAASxgB,OAAT,EAAkBugB,aAAlB,EAAiC;;AAE7C,qBAAIxS,OAAO/N,QAAQgO,aAAR,CAAsB,mBAAtB,EAA2CM,WAAtD;AAAA,qBACIsR,aAAalhB,MAAMW,IAAN,CAAWwgB,iBAAX,EADjB;AAAA,qBAEIqE,aAAaxlB,MAAMW,IAAN,CAAWyhB,YAAX,CAAwB/S,IAAxB,CAFjB;;AAIAmW,4BAAW9W,OAAX,CAAmB8T,MAAnB,GAA4B,IAA5B;AACAgD,4BAAW1d,WAAX,CAAuBoZ,UAAvB;;AAEAW,+BAAc1Q,YAAd,CAA2BqU,UAA3B,EAAuClkB,OAAvC;AACAkkB,4BAAWlW,aAAX,CAAyB,oBAAzB,EAA+C0L,KAA/C;AAEH,UAZD;;AAcAja,kBAAS4gB,MAAT,GAAkB,UAASrgB,OAAT,EAAkB;;AAEhC,qBAAImO,YAAYnO,QAAQoN,OAAR,CAAgBe,SAAhC;AAAA,qBACI4R,mBAAmBrhB,MAAMe,QAAN,CAAeugB,uBAAf,CAAuC7R,SAAvC,CADvB;;AAGA4R,kCAAiBtZ,SAAjB,GAA6B,EAA7B;;AAEAzG,yBAAQgD,UAAR,CAAmBoO,WAAnB,CAA+BpR,OAA/B;AAEH,UATD;;AAWAP,kBAASyM,WAAT,GAAuB,UAASiY,WAAT,EAAsB;;AAEzC,qBAAInkB,UAAUtB,MAAMW,IAAN,CAAWkQ,IAAX,CAAgB,KAAhB,EAAuB,qBAAvB,CAAd;AAAA,qBACIxB,OAAOrP,MAAMW,IAAN,CAAWoiB,WAAX,CAAuB0C,YAAYpW,IAAnC,CADX;AAAA,qBAEIE,OAAOvP,MAAMW,IAAN,CAAW4hB,aAAX,CAAyB,KAAzB,EAAgCkD,YAAYlW,IAA5C,CAFX;AAAA,qBAGImW,YAAY1lB,MAAMW,IAAN,CAAW0hB,mBAAX,EAHhB;AAAA,qBAIIsD,UAAU3lB,MAAMW,IAAN,CAAW2hB,iBAAX,EAJd;;AAMAhhB,yBAAQoN,OAAR,CAAgBc,OAAhB,GAAiCiW,YAAY,UAAZ,CAAjC;AACAnkB,yBAAQoN,OAAR,CAAgBe,SAAhB,GAAiCgW,YAAY,YAAZ,CAAjC;AACAnkB,yBAAQoN,OAAR,CAAgBgB,cAAhB,GAAiC+V,YAAY,iBAAZ,CAAjC;AACAnkB,yBAAQoN,OAAR,CAAgBiB,YAAhB,GAAiC8V,YAAY,eAAZ,CAAjC;;AAEAnkB,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe0gB,cAAtD;AACA9f,yBAAQ8I,gBAAR,CAAyB,YAAzB,EAAuCpK,MAAMU,QAAN,CAAe8gB,aAAtD;;AAEAlgB,yBAAQwG,WAAR,CAAoBuH,IAApB;AACA/N,yBAAQwG,WAAR,CAAoByH,IAApB;AACAjO,yBAAQwG,WAAR,CAAoB4d,SAApB;AACApkB,yBAAQwG,WAAR,CAAoB6d,OAApB;;AAEA5kB,0BAAS6kB,sBAAT,CAAgCH,YAAY,YAAZ,CAAhC,EAA2DA,YAAY,UAAZ,CAA3D,EAAoFA,YAAY,iBAAZ,CAApF,EAAoHA,YAAY,eAAZ,CAApH;;AAEAzlB,uBAAMoB,KAAN,CAAYG,YAAZ,CAAyBuG,WAAzB,CAAqCxG,OAArC;;AAEA,wBAAOA,OAAP;AAEH,UA3BD;;AA6BAP,kBAAS8kB,YAAT,GAAwB,UAASje,EAAT,EAAa;AAClC,wBAAO5H,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBmN,aAArB,CAAmC,wBAAsB1H,EAAtB,GAAyB,IAA5D,CAAP;AACF,UAFD;;AAID7G,kBAASugB,uBAAT,GAAmC,UAAS1Z,EAAT,EAAa;AAC3C,wBAAO5H,MAAMoB,KAAN,CAAYe,QAAZ,CAAqBmN,aAArB,CAAmC,2BAAyB1H,EAAzB,GAA4B,IAA/D,CAAP;AACH,UAFF;;AAIA7G,kBAASwgB,cAAT,GAA0B,UAAS3Z,EAAT,EAAa;AAClC,wBAAO5H,MAAMoB,KAAN,CAAYG,YAAZ,CAAyB+N,aAAzB,CAAuC,0BAAwB1H,EAAxB,GAA2B,IAAlE,CAAP;AACH,UAFF;;AAIA7G,kBAAS6kB,sBAAT,GAAkC,UAASnW,SAAT,EAAoBD,OAApB,EAA6BE,cAA7B,EAA6CC,YAA7C,EAA2D;;AAEzF,qBAAIzE,QAAQnK,SAAS8kB,YAAT,CAAsBrW,OAAtB,CAAZ;AAAA,qBACIuK,QAAQtW,SAASuW,WAAT,EADZ;AAAA,qBAEIoL,YAAYplB,MAAMW,IAAN,CAAW0gB,gBAAX,EAFhB;AAAA,qBAGIzM,WAAW5U,MAAMO,OAAN,CAAc+R,8BAAd,CAA6CpH,KAA7C,EAAoD,CAApD,CAHf;;AAKAka,2BAAU1W,OAAV,CAAkBe,SAAlB,GAA8BA,SAA9B;;AAEAsK,uBAAMmC,QAAN,CAAetH,QAAf,EAAyBlF,cAAzB;AACAqK,uBAAM6B,MAAN,CAAahH,QAAb,EAAuBjF,YAAvB;;AAEAoK,uBAAMsL,gBAAN,CAAuBD,SAAvB;AAEH,UAdD;;AAgBC,gBAAOrkB,QAAP;AAEH,EA3Hc,CA2Hb,EA3Ha,CAAf;;AA6HAjB,QAAOC,OAAP,GAAiBgB,QAAjB,C","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 992983c8d5f440faae7c","/**\r\n *\r\n */\r\n\r\n'use strict';\r\n\r\nvar editor = require('./editor');\r\nmodule.exports = editor;\r\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\r\n * @author Codex Team\r\n * @version 1.0.6\r\n */\r\n\r\nvar codex = (function(codex){\r\n\r\n var init = function() {\r\n\r\n codex.core = require('./modules/core');\r\n codex.ui = require('./modules/ui');\r\n codex.transport = require('./modules/transport');\r\n codex.renderer = require('./modules/renderer');\r\n codex.saver = require('./modules/saver');\r\n codex.content = require('./modules/content');\r\n codex.toolbar = require('./modules/toolbar/toolbar');\r\n codex.tools = require('./modules/tools');\r\n codex.callback = require('./modules/callbacks');\r\n codex.draw = require('./modules/draw');\r\n codex.caret = require('./modules/caret');\r\n codex.notifications = require('./modules/notifications');\r\n codex.parser = require('./modules/parser');\r\n codex.comments = require('./modules/comments');\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * holds initial settings\r\n */\r\n codex.settings = {\r\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\r\n textareaId: 'codex-editor',\r\n uploadImagesUrl: '/editor/transport/',\r\n\r\n // Type of block showing on empty editor\r\n initialBlockPlugin: \"paragraph\"\r\n };\r\n\r\n /**\r\n * public\r\n *\r\n * Static nodes\r\n */\r\n codex.nodes = {\r\n textarea : null,\r\n wrapper : null,\r\n commentsSide : null,\r\n toolbar : null,\r\n inlineToolbar : {\r\n wrapper : null,\r\n buttons : null,\r\n actions : null\r\n },\r\n toolbox : null,\r\n notifications : null,\r\n plusButton : null,\r\n showSettingsButton: null,\r\n showTrashButton : null,\r\n blockSettings : null,\r\n pluginSettings : null,\r\n defaultSettings : null,\r\n toolbarButtons : {}, // { type : DomEl, ... }\r\n redactor : null\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * Output state\r\n */\r\n codex.state = {\r\n jsonOutput: [],\r\n blocks : [],\r\n inputs : [],\r\n comments : []\r\n };\r\n\r\n /**\r\n * Initialization\r\n * @uses Promise cEditor.core.prepare\r\n * @param {} userSettings are :\r\n * - tools [],\r\n * - textareaId String\r\n * ...\r\n *\r\n * Load user defined tools\r\n * Tools must contain this important objects :\r\n * @param {String} type - this is a type of plugin. It can be used as plugin name\r\n * @param {String} iconClassname - this a icon in toolbar\r\n * @param {Object} make - what should plugin do, when it is clicked\r\n * @param {Object} appendCallback - callback after clicking\r\n * @param {Element} settings - what settings does it have\r\n * @param {Object} render - plugin get JSON, and should return HTML\r\n * @param {Object} save - plugin gets HTML content, returns JSON\r\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\r\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\r\n *\r\n * @example\r\n * - type : 'header',\r\n * - iconClassname : 'ce-icon-header',\r\n * - make : headerTool.make,\r\n * - appendCallback : headerTool.appendCallback,\r\n * - settings : headerTool.makeSettings(),\r\n * - render : headerTool.render,\r\n * - save : headerTool.save,\r\n * - displayInToolbox : true,\r\n * - enableLineBreaks : false\r\n */\r\n codex.start = function (userSettings) {\r\n\r\n init();\r\n\r\n this.core.prepare(userSettings)\r\n\r\n // If all ok, make UI, bind events and parse initial-content\r\n .then(this.ui.make)\r\n .then(this.ui.addTools)\r\n .then(this.ui.bindEvents)\r\n .then(this.ui.preparePlugins)\r\n .then(this.transport.prepare)\r\n .then(this.renderer.makeBlocksFromData)\r\n .then(this.ui.saveInputs)\r\n .catch(function (error) {\r\n codex.core.log('Initialization failed with error: %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n return codex;\r\n\r\n})({});\r\n\r\nmodule.exports = codex;\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","var core = (function(core) {\r\n\r\n /**\r\n * @public\r\n *\r\n * Editor preparing method\r\n * @return Promise\r\n */\r\n core.prepare = function (userSettings) {\r\n\r\n return new Promise(function(resolve, reject) {\r\n\r\n if ( userSettings ){\r\n\r\n codex.settings.tools = userSettings.tools || codex.settings.tools;\r\n\r\n }\r\n\r\n if (userSettings.data) {\r\n codex.state.blocks = userSettings.data;\r\n }\r\n\r\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\r\n\r\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\r\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\r\n } else {\r\n resolve();\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Logging method\r\n * @param type = ['log', 'info', 'warn']\r\n */\r\n core.log = function (msg, type, arg) {\r\n\r\n type = type || 'log';\r\n\r\n if (!arg) {\r\n arg = msg || 'undefined';\r\n msg = '[codex-editor]: %o';\r\n } else {\r\n msg = '[codex-editor]: ' + msg;\r\n }\r\n\r\n try{\r\n if ( 'console' in window && console[ type ] ){\r\n if ( arg ) console[ type ]( msg , arg );\r\n else console[ type ]( msg );\r\n }\r\n\r\n }catch(e){}\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Helper for insert one element after another\r\n */\r\n core.insertAfter = function (target, element) {\r\n target.parentNode.insertBefore(element, target.nextSibling);\r\n };\r\n\r\n /**\r\n * @const\r\n *\r\n * Readable DOM-node types map\r\n */\r\n core.nodeTypes = {\r\n TAG : 1,\r\n TEXT : 3,\r\n COMMENT : 8\r\n };\r\n\r\n /**\r\n * @const\r\n * Readable keys map\r\n */\r\n core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Check object for DOM node\r\n */\r\n core.isDomNode = function (el) {\r\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\r\n };\r\n\r\n /**\r\n * Native Ajax\r\n */\r\n core.ajax = function (data) {\r\n\r\n if (!data || !data.url){\r\n return;\r\n }\r\n\r\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\r\n success_function = function(){},\r\n params = '',\r\n obj;\r\n\r\n data.async = true;\r\n data.type = data.type || 'GET';\r\n data.data = data.data || '';\r\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\r\n success_function = data.success || success_function ;\r\n\r\n if (data.type == 'GET' && data.data) {\r\n\r\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\r\n\r\n } else {\r\n\r\n for(obj in data.data) {\r\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\r\n }\r\n }\r\n\r\n if (data.withCredentials) {\r\n XMLHTTP.withCredentials = true;\r\n }\r\n\r\n if (data.beforeSend && typeof data.beforeSend == 'function') {\r\n data.beforeSend.call();\r\n }\r\n\r\n XMLHTTP.open( data.type, data.url, data.async );\r\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\r\n\r\n XMLHTTP.onreadystatechange = function() {\r\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\r\n success_function(XMLHTTP.responseText);\r\n }\r\n };\r\n\r\n XMLHTTP.send(params);\r\n };\r\n\r\n /** Appends script to head of document */\r\n core.importScript = function(scriptPath, instanceName) {\r\n\r\n /** Script is already loaded */\r\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\r\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\r\n return;\r\n }\r\n\r\n\r\n var script = document.createElement('SCRIPT');\r\n script.type = \"text/javascript\";\r\n script.src = scriptPath;\r\n script.async = true;\r\n script.defer = true;\r\n\r\n if (instanceName) {\r\n script.id = \"ce-script-\" + instanceName;\r\n }\r\n\r\n document.head.appendChild(script);\r\n return script;\r\n };\r\n\r\n return core;\r\n\r\n})({});\r\n\r\nmodule.exports = core;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var ui = (function(ui){\r\n\r\n /**\r\n * Basic editor classnames\r\n */\r\n ui.className = {\r\n\r\n /**\r\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\r\n */\r\n BLOCK_CLASSNAME : 'ce-block',\r\n\r\n /**\r\n * @const {String} wrapper for plugins content\r\n */\r\n BLOCK_CONTENT : 'ce-block__content',\r\n\r\n /**\r\n * @const {String} BLOCK_STRETCHED - makes block stretched\r\n */\r\n BLOCK_STRETCHED : 'ce-block--stretched',\r\n\r\n /**\r\n * @const {String} BLOCK_HIGHLIGHTED - adds background\r\n */\r\n BLOCK_HIGHLIGHTED : 'ce-block--focused',\r\n\r\n /**\r\n * @const {String} - highlights covered blocks\r\n */\r\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\r\n\r\n /**\r\n * @const {String} - for all default settings\r\n */\r\n SETTINGS_ITEM : 'ce-settings__item'\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Making main interface\r\n */\r\n ui.make = function () {\r\n\r\n var wrapper,\r\n toolbar,\r\n toolbarContent,\r\n inlineToolbar,\r\n commentsSide,\r\n redactor,\r\n ceBlock,\r\n notifications,\r\n blockButtons,\r\n blockSettings,\r\n showSettingsButton,\r\n showTrashButton,\r\n toolbox,\r\n plusButton;\r\n\r\n /** Make editor wrapper */\r\n wrapper = codex.draw.wrapper();\r\n\r\n /** Append editor wrapper after initial textarea */\r\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\r\n\r\n /** Append block with notifications to the document */\r\n notifications = codex.draw.alertsHolder();\r\n codex.nodes.notifications = document.body.appendChild(notifications);\r\n\r\n /** Make toolbar and content-editable redactor */\r\n toolbar = codex.draw.toolbar();\r\n toolbarContent = codex.draw.toolbarContent();\r\n inlineToolbar = codex.draw.inlineToolbar();\r\n plusButton = codex.draw.plusButton();\r\n showSettingsButton = codex.draw.settingsButton();\r\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\r\n blockSettings = codex.draw.blockSettings();\r\n blockButtons = codex.draw.blockButtons();\r\n toolbox = codex.draw.toolbox();\r\n redactor = codex.draw.redactor();\r\n commentsSide = codex.draw.commentsSide();\r\n\r\n /** settings */\r\n var defaultSettings = codex.draw.defaultSettings(),\r\n pluginSettings = codex.draw.pluginsSettings();\r\n\r\n /** Add default and plugins settings */\r\n blockSettings.appendChild(pluginSettings);\r\n blockSettings.appendChild(defaultSettings);\r\n\r\n /** Make blocks buttons\r\n * This block contains settings button and remove block button\r\n */\r\n blockButtons.appendChild(showSettingsButton);\r\n blockButtons.appendChild(showTrashButton);\r\n blockButtons.appendChild(blockSettings);\r\n\r\n /** Append plus button */\r\n toolbarContent.appendChild(plusButton);\r\n\r\n /** Appending toolbar tools */\r\n toolbarContent.appendChild(toolbox);\r\n\r\n /** Appending first-level block buttons */\r\n toolbar.appendChild(blockButtons);\r\n\r\n /** Append toolbarContent to toolbar */\r\n toolbar.appendChild(toolbarContent);\r\n\r\n wrapper.appendChild(commentsSide);\r\n\r\n wrapper.appendChild(toolbar);\r\n\r\n wrapper.appendChild(redactor);\r\n\r\n /** Save created ui-elements to static nodes state */\r\n codex.nodes.wrapper = wrapper;\r\n codex.nodes.commentsSide = commentsSide;\r\n codex.nodes.toolbar = toolbar;\r\n codex.nodes.plusButton = plusButton;\r\n codex.nodes.toolbox = toolbox;\r\n codex.nodes.blockSettings = blockSettings;\r\n codex.nodes.pluginSettings = pluginSettings;\r\n codex.nodes.defaultSettings = defaultSettings;\r\n codex.nodes.showSettingsButton = showSettingsButton;\r\n codex.nodes.showTrashButton = showTrashButton;\r\n\r\n codex.nodes.redactor = redactor;\r\n\r\n codex.ui.makeInlineToolbar(inlineToolbar);\r\n\r\n /** fill in default settings */\r\n codex.toolbar.settings.addDefaultSettings();\r\n };\r\n\r\n ui.makeInlineToolbar = function(container) {\r\n\r\n /** Append to redactor new inline block */\r\n codex.nodes.inlineToolbar.wrapper = container;\r\n\r\n /** Draw toolbar buttons */\r\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\r\n\r\n /** Buttons action or settings */\r\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\r\n\r\n /** Append to inline toolbar buttons as part of it */\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\r\n\r\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\r\n };\r\n\r\n /**\r\n * @private\r\n * Append tools passed in codex.tools\r\n */\r\n ui.addTools = function () {\r\n\r\n var tool,\r\n tool_button;\r\n\r\n for(var name in codex.settings.tools) {\r\n tool = codex.settings.tools[name];\r\n codex.tools[name] = tool;;\r\n }\r\n\r\n /** Make toolbar buttons */\r\n for (var name in codex.tools){\r\n\r\n tool = codex.tools[name];\r\n\r\n if (!tool.displayInToolbox) {\r\n continue;\r\n }\r\n\r\n if (!tool.iconClassname) {\r\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n if (typeof tool.make != 'function') {\r\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n /**\r\n * if tools is for toolbox\r\n */\r\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\r\n\r\n codex.nodes.toolbox.appendChild(tool_button);\r\n\r\n /** Save tools to static nodes */\r\n codex.nodes.toolbarButtons[name] = tool_button;\r\n }\r\n\r\n\r\n /**\r\n * Add inline toolbar tools\r\n */\r\n codex.ui.addInlineToolbarTools();\r\n\r\n\r\n };\r\n\r\n ui.addInlineToolbarTools = function() {\r\n\r\n var tools = {\r\n\r\n bold: {\r\n icon : 'ce-icon-bold',\r\n command : 'bold'\r\n },\r\n\r\n italic: {\r\n icon : 'ce-icon-italic',\r\n command : 'italic'\r\n },\r\n\r\n underline: {\r\n icon : 'ce-icon-underline',\r\n command : 'underline'\r\n },\r\n\r\n link: {\r\n icon : 'ce-icon-link',\r\n command : 'createLink',\r\n },\r\n\r\n comment: {\r\n icon : 'ce-icon-newspaper',\r\n command : 'addComment'\r\n }\r\n };\r\n\r\n var toolButton,\r\n tool;\r\n\r\n for(var name in tools) {\r\n\r\n tool = tools[name];\r\n\r\n toolButton = codex.draw.toolbarButtonInline(name, tool.icon);\r\n\r\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\r\n /**\r\n * Add callbacks to this buttons\r\n */\r\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n * Bind editor UI events\r\n */\r\n ui.bindEvents = function () {\r\n\r\n codex.core.log('ui.bindEvents fired', 'info');\r\n\r\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\r\n codex.notifications.errorThrown(errorMsg, event);\r\n }, false );\r\n\r\n /** All keydowns on Document */\r\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\r\n\r\n /** All keydowns on Document */\r\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\r\n\r\n /**\r\n * Mouse click to radactor\r\n */\r\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\r\n\r\n /**\r\n * Clicks to the Plus button\r\n */\r\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\r\n\r\n /**\r\n * Clicks to SETTINGS button in toolbar\r\n */\r\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\r\n\r\n /**\r\n * @deprecated ( but now in use for syncronization );\r\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\r\n */\r\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\r\n\r\n /** Bind click listeners on toolbar buttons */\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Initialize plugins before using\r\n * Ex. Load scripts or call some internal methods\r\n */\r\n ui.preparePlugins = function() {\r\n\r\n for(var tool in codex.tools) {\r\n\r\n if (typeof codex.tools[tool].prepare != 'function')\r\n continue;\r\n\r\n codex.tools[tool].prepare();\r\n }\r\n },\r\n\r\n ui.addBlockHandlers = function(block) {\r\n\r\n if (!block) return;\r\n\r\n /**\r\n * Block keydowns\r\n */\r\n block.addEventListener('keydown', function(event) {\r\n codex.callback.blockKeydown(event, block);\r\n }, false);\r\n\r\n /**\r\n * Pasting content from another source\r\n */\r\n block.addEventListener('paste', function (event) {\r\n codex.callback.blockPaste(event);\r\n }, false);\r\n\r\n block.addEventListener('mouseup', function(){\r\n codex.toolbar.inline.show();\r\n }, false);\r\n\r\n };\r\n\r\n /** getting all contenteditable elements */\r\n ui.saveInputs = function() {\r\n\r\n var redactor = codex.nodes.redactor,\r\n elements = [];\r\n\r\n /** Save all inputs in global variable state */\r\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\r\n };\r\n\r\n /**\r\n * Adds first initial block on empty redactor\r\n */\r\n ui.addInitialBlock = function(){\r\n\r\n var initialBlockType = codex.settings.initialBlockPlugin,\r\n initialBlock;\r\n\r\n if ( !codex.tools[initialBlockType] ){\r\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\r\n return;\r\n }\r\n\r\n initialBlock = codex.tools[initialBlockType].render();\r\n\r\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\r\n\r\n codex.content.insertBlock({\r\n type : initialBlockType,\r\n block : initialBlock\r\n });\r\n\r\n codex.content.workingNodeChanged(initialBlock);\r\n\r\n };\r\n\r\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\r\n\r\n button.addEventListener('mousedown', function(event) {\r\n\r\n codex.toolbar.inline.toolClicked(event, type);\r\n\r\n }, false);\r\n };\r\n\r\n return ui;\r\n\r\n})({});\r\n\r\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\r\n *\r\n * Codex.Editor Transport Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0.0\r\n */\r\n\r\nvar transport = (function(transport){\r\n\r\n transport.input = null;\r\n\r\n /**\r\n * @property {Object} arguments - keep plugin settings and defined callbacks\r\n */\r\n transport.arguments = null;\r\n\r\n transport.prepare = function(){\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'file';\r\n input.addEventListener('change', codex.transport.fileSelected);\r\n\r\n codex.transport.input = input;\r\n\r\n };\r\n\r\n /** Clear input when files is uploaded */\r\n transport.clearInput = function() {\r\n\r\n /** Remove old input */\r\n this.input = null;\r\n\r\n /** Prepare new one */\r\n this.prepare();\r\n };\r\n\r\n /**\r\n * Callback for file selection\r\n */\r\n transport.fileSelected = function(event){\r\n\r\n var input = this,\r\n files = input.files,\r\n filesLength = files.length,\r\n formdData = new FormData(),\r\n file,\r\n i;\r\n\r\n formdData.append('files', files[0], files[0].name);\r\n\r\n codex.transport.ajax({\r\n data : formdData,\r\n beforeSend : codex.transport.arguments.beforeSend,\r\n success : codex.transport.arguments.success,\r\n error : codex.transport.arguments.error\r\n });\r\n };\r\n\r\n /**\r\n * Use plugin callbacks\r\n * @protected\r\n */\r\n transport.selectAndUpload = function (args) {\r\n\r\n this.arguments = args;\r\n this.input.click();\r\n\r\n };\r\n\r\n /**\r\n * Ajax requests module\r\n */\r\n transport.ajax = function(params){\r\n\r\n var xhr = new XMLHttpRequest(),\r\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\r\n success = typeof params.success == 'function' ? params.success : function(){},\r\n error = typeof params.error == 'function' ? params.error : function(){};\r\n\r\n beforeSend();\r\n\r\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\r\n\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\r\n xhr.onload = function () {\r\n if (xhr.status === 200) {\r\n success(xhr.responseText);\r\n } else {\r\n console.log(\"request error: %o\", xhr);\r\n error();\r\n }\r\n };\r\n\r\n xhr.send(params.data);\r\n this.clearInput();\r\n\r\n };\r\n\r\n return transport;\r\n\r\n})({});\r\n\r\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var renderer = (function(renderer) {\r\n\r\n /**\r\n * Asyncronously parses input JSON to redactor blocks\r\n */\r\n renderer.makeBlocksFromData = function () {\r\n\r\n /**\r\n * If redactor is empty, add first paragraph to start writing\r\n */\r\n if (!codex.state.blocks.items.length) {\r\n\r\n codex.ui.addInitialBlock();\r\n return;\r\n\r\n }\r\n\r\n Promise.resolve()\r\n\r\n /** First, get JSON from state */\r\n .then(function() {\r\n return codex.state.blocks;\r\n })\r\n\r\n /** Then, start to iterate they */\r\n .then(codex.renderer.appendBlocks)\r\n\r\n /** Write log if something goes wrong */\r\n .catch(function(error) {\r\n codex.core.log('Error while parsing JSON: %o', 'error', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Parses JSON to blocks\r\n * @param {object} data\r\n * @return Primise -> nodeList\r\n */\r\n renderer.appendBlocks = function (data) {\r\n\r\n var blocks = data.items;\r\n\r\n /**\r\n * Sequence of one-by-one blocks appending\r\n * Uses to save blocks order after async-handler\r\n */\r\n var nodeSequence = Promise.resolve();\r\n\r\n for (var index = 0; index < blocks.length ; index++ ) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n renderer.appendComments = function() {\r\n\r\n var comments = codex.state.blocks.comments;\r\n\r\n for (var i = 0; i < comments.length; i++) {\r\n codex.comments.makeComment(comments[i]);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Append node at specified index\r\n */\r\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\r\n\r\n /** We need to append node to sequence */\r\n nodeSequence\r\n\r\n /** first, get node async-aware */\r\n .then(function() {\r\n\r\n return codex.renderer.getNodeAsync(blocks , index);\r\n\r\n })\r\n\r\n /**\r\n * second, compose editor-block from JSON object\r\n */\r\n .then(codex.renderer.createBlockFromData)\r\n\r\n /**\r\n * now insert block to redactor\r\n */\r\n .then(function(blockData){\r\n\r\n /**\r\n * blockData has 'block', 'type', 'id' and 'stretched' information\r\n */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** Pass created block to next step */\r\n return blockData.block;\r\n\r\n })\r\n\r\n /** Log if something wrong with node */\r\n .catch(function(error) {\r\n codex.core.log('Node skipped while parsing because %o', 'error', error);\r\n });\r\n\r\n return nodeSequence;\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n renderer.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Creates editor block by JSON-data\r\n *\r\n * @uses render method of each plugin\r\n *\r\n * @param {object} blockData looks like\r\n * { header : {\r\n * text: '',\r\n * type: 'H3', ...\r\n * }\r\n * }\r\n * @return {object} with type and Element\r\n */\r\n renderer.createBlockFromData = function (blockData) {\r\n\r\n /** New parser */\r\n var pluginName = blockData.type,\r\n cover = blockData.cover,\r\n id = blockData.id || +new Date();\r\n\r\n /** Get first key of object that stores plugin name */\r\n // for (var pluginName in blockData) break;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].render != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have «render» method`);\r\n }\r\n\r\n /** New Parser */\r\n var block = codex.tools[pluginName].render(blockData.data);\r\n\r\n /** is first-level block stretched */\r\n var stretched = codex.tools[pluginName].isStretched || false;\r\n\r\n /** Retrun type and block */\r\n return {\r\n type : pluginName,\r\n block : block,\r\n stretched : stretched,\r\n cover : cover,\r\n id: id\r\n };\r\n\r\n };\r\n\r\n return renderer;\r\n\r\n})({});\r\n\r\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var saver = (function(saver) {\r\n\r\n /**\r\n * Saves blocks\r\n * @private\r\n */\r\n saver.saveBlocks = function () {\r\n\r\n /** Save html content of redactor to memory */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n /** Empty jsonOutput state */\r\n codex.state.jsonOutput = [];\r\n\r\n Promise.resolve()\r\n\r\n .then(function() {\r\n return codex.nodes.redactor.childNodes;\r\n })\r\n /** Making a sequence from separate blocks */\r\n .then(codex.saver.makeQueue)\r\n\r\n .then(function() {\r\n // codex.nodes.textarea.innerHTML = codex.state.html;\r\n })\r\n\r\n .catch( function(error) {\r\n console.log('Something happend');\r\n });\r\n\r\n };\r\n\r\n saver.makeQueue = function(blocks) {\r\n\r\n var queue = Promise.resolve();\r\n\r\n for(var index = 0; index < blocks.length; index++) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.saver.getBlockData(queue, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /** Gets every block and makes From Data */\r\n saver.getBlockData = function(queue, blocks, index) {\r\n\r\n queue.then(function() {\r\n return codex.saver.getNodeAsync(blocks, index);\r\n })\r\n\r\n .then(codex.saver.makeFormDataFromBlocks);\r\n\r\n };\r\n\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n saver.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n saver.makeFormDataFromBlocks = function(block) {\r\n\r\n var pluginName = block.dataset.tool;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].save != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have save method`);\r\n }\r\n\r\n /** Result saver */\r\n var blockContent = block.childNodes[1],\r\n pluginsContent = blockContent.childNodes[0],\r\n savedData = codex.tools[pluginName].save(pluginsContent),\r\n output;\r\n\r\n output = {\r\n type: pluginName,\r\n data: savedData\r\n };\r\n\r\n /** Marks Blocks that will be in main page */\r\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n output.id = block.dataset.id;\r\n\r\n codex.state.jsonOutput.push(output);\r\n };\r\n\r\n saver.saveComments = function() {\r\n\r\n var comments = [],\r\n wrappers = codex.nodes.commentsSide.querySelectorAll('.ce-comment__wrapper');\r\n\r\n for (var i = 0; i < wrappers.length; i++) {\r\n\r\n var text = wrappers[i].querySelector('.ce-comment__text'),\r\n time = wrappers[i].querySelector('.ce-comment__time'),\r\n blockId = wrappers[i].dataset.blockId,\r\n commentId = wrappers[i].dataset.commentId,\r\n selectionStart = wrappers[i].dataset.selectionStart,\r\n selectionEnd = wrappers[i].dataset.selectionEnd;\r\n\r\n if (text && time) {\r\n comments.push({\r\n text : text.textContent,\r\n time : time.textContent,\r\n 'block-id' : blockId,\r\n 'comment-id' : commentId,\r\n 'selection-start': selectionStart,\r\n 'selection-end': selectionEnd\r\n });\r\n }\r\n }\r\n\r\n\r\n codex.state.comments = comments;\r\n\r\n };\r\n\r\n return saver;\r\n\r\n})({});\r\n\r\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var content = (function(content) {\r\n\r\n content.currentNode = null;\r\n\r\n /**\r\n * Synchronizes redactor with original textarea\r\n */\r\n content.sync = function () {\r\n\r\n codex.core.log('syncing...');\r\n\r\n /**\r\n * Save redactor content to codex.state\r\n */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n };\r\n\r\n /**\r\n * @deprecated\r\n */\r\n content.getNodeFocused = function() {\r\n\r\n var selection = window.getSelection(),\r\n focused;\r\n\r\n if (selection.anchorNode === null) {\r\n return null;\r\n }\r\n\r\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\r\n focused = selection.anchorNode;\r\n } else {\r\n focused = selection.focusNode.parentElement;\r\n }\r\n\r\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\r\n\r\n /** Iterate with parent nodes to find first-level*/\r\n var parent = focused.parentNode;\r\n\r\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\r\n parent = parent.parentNode;\r\n }\r\n\r\n focused = parent;\r\n }\r\n\r\n if (focused != codex.nodes.redactor){\r\n return focused;\r\n }\r\n\r\n return null;\r\n\r\n };\r\n\r\n /**\r\n * Appends background to the block\r\n */\r\n content.markBlock = function() {\r\n\r\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n };\r\n\r\n /**\r\n * Clear background\r\n */\r\n content.clearMark = function() {\r\n\r\n if (codex.content.currentNode) {\r\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Finds first-level block\r\n * @param {Element} node - selected or clicked in redactors area node\r\n */\r\n content.getFirstLevelBlock = function(node) {\r\n\r\n if (!codex.core.isDomNode(node)) {\r\n node = node.parentNode;\r\n }\r\n\r\n if (node === codex.nodes.redactor || node === document.body) {\r\n\r\n return null;\r\n\r\n } else {\r\n\r\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n node = node.parentNode;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Trigger this event when working node changed\r\n * @param {Element} targetNode - first-level of this node will be current\r\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\r\n */\r\n content.workingNodeChanged = function (targetNode) {\r\n\r\n /** Clear background from previous marked block before we change */\r\n codex.content.clearMark();\r\n\r\n if (!targetNode) {\r\n return;\r\n }\r\n\r\n this.currentNode = this.getFirstLevelBlock(targetNode);\r\n\r\n };\r\n\r\n /**\r\n * Replaces one redactor block with another\r\n * @protected\r\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\r\n * @param {Element} newBlock\r\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\r\n *\r\n * [!] Function does not saves old block content.\r\n * You can get it manually and pass with newBlock.innerHTML\r\n */\r\n content.replaceBlock = function function_name(targetBlock, newBlock) {\r\n\r\n if (!targetBlock || !newBlock){\r\n codex.core.log('replaceBlock: missed params');\r\n return;\r\n }\r\n\r\n /** If target-block is not a frist-level block, then we iterate parents to find it */\r\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n targetBlock = targetBlock.parentNode;\r\n }\r\n\r\n /** Replacing */\r\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Add block handlers\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Inserts new block to redactor\r\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\r\n *\r\n * @param blockData {object}\r\n * @param blockData.block {Element} element with block content\r\n * @param blockData.type {string} block plugin\r\n * @param needPlaceCaret {bool} pass true to set caret in new block\r\n *\r\n */\r\n content.insertBlock = function( blockData, needPlaceCaret ) {\r\n\r\n var workingBlock = codex.content.currentNode,\r\n newBlockContent = blockData.block,\r\n blockType = blockData.type,\r\n blockId = blockData.id,\r\n cover = blockData.cover,\r\n isStretched = blockData.stretched;\r\n\r\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched, blockId);\r\n\r\n if (cover === true) {\r\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n }\r\n\r\n if (workingBlock) {\r\n\r\n codex.core.insertAfter(workingBlock, newBlock);\r\n\r\n } else {\r\n /**\r\n * If redactor is empty, append as first child\r\n */\r\n codex.nodes.redactor.appendChild(newBlock);\r\n\r\n }\r\n\r\n /**\r\n * Block handler\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n\r\n if ( needPlaceCaret ) {\r\n\r\n /**\r\n * If we don't know input index then we set default value -1\r\n */\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\r\n\r\n\r\n if (currentInputIndex == -1) {\r\n\r\n\r\n var editableElement = newBlock.querySelector('[contenteditable]'),\r\n emptyText = document.createTextNode('');\r\n\r\n editableElement.appendChild(emptyText);\r\n codex.caret.set(editableElement, 0, 0);\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.showPlusButton();\r\n\r\n\r\n } else {\r\n\r\n /** Timeout for browsers execution */\r\n setTimeout(function () {\r\n\r\n /** Setting to the new input */\r\n codex.caret.setToNextBlock(currentInputIndex);\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n }, 10);\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Replaces blocks with saving content\r\n * @protected\r\n * @param {Element} noteToReplace\r\n * @param {Element} newNode\r\n * @param {Element} blockType\r\n */\r\n content.switchBlock = function(blockToReplace, newBlock, tool){\r\n\r\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\r\n\r\n /** Replacing */\r\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\r\n\r\n /** Save new Inputs when block is changed */\r\n codex.ui.saveInputs();\r\n };\r\n\r\n /**\r\n * Iterates between child noted and looking for #text node on deepest level\r\n * @private\r\n * @param {Element} block - node where find\r\n * @param {int} postiton - starting postion\r\n * Example: childNodex.length to find from the end\r\n * or 0 to find from the start\r\n * @return {Text} block\r\n * @uses DFS\r\n */\r\n content.getDeepestTextNodeFromPosition = function (block, position) {\r\n\r\n /**\r\n * Clear Block from empty and useless spaces with trim.\r\n * Such nodes we should remove\r\n */\r\n var blockChilds = block.childNodes,\r\n index,\r\n node,\r\n text;\r\n\r\n for(index = 0; index < blockChilds.length; index++)\r\n {\r\n node = blockChilds[index];\r\n\r\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\r\n\r\n text = node.textContent.trim();\r\n\r\n /** Text is empty. We should remove this child from node before we start DFS\r\n * decrease the quantity of childs.\r\n */\r\n if (text === '') {\r\n\r\n block.removeChild(node);\r\n position--;\r\n }\r\n }\r\n }\r\n\r\n if (block.childNodes.length === 0) {\r\n return document.createTextNode('');\r\n }\r\n\r\n /** Setting default position when we deleted all empty nodes */\r\n if ( position < 0 )\r\n position = 1;\r\n\r\n var looking_from_start = false;\r\n\r\n /** For looking from START */\r\n if (position === 0) {\r\n looking_from_start = true;\r\n position = 1;\r\n }\r\n\r\n while ( position ) {\r\n\r\n /** initial verticle of node. */\r\n if ( looking_from_start ) {\r\n block = block.childNodes[0];\r\n } else {\r\n block = block.childNodes[position - 1];\r\n }\r\n\r\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\r\n\r\n position = block.childNodes.length;\r\n\r\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\r\n\r\n position = 0;\r\n }\r\n\r\n }\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n content.composeNewBlock = function (block, tool, isStretched, id) {\r\n\r\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\r\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\r\n\r\n blockContent.appendChild(block);\r\n newBlock.appendChild(blockContent);\r\n\r\n if (isStretched) {\r\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\r\n }\r\n\r\n newBlock.dataset.tool = tool;\r\n newBlock.dataset.id = id || +(new Date);\r\n return newBlock;\r\n };\r\n\r\n /**\r\n * Returns Range object of current selection\r\n */\r\n content.getRange = function() {\r\n\r\n var selection = window.getSelection().getRangeAt(0);\r\n\r\n return selection;\r\n };\r\n\r\n /**\r\n * Divides block in two blocks (after and before caret)\r\n * @private\r\n * @param {Int} inputIndex - target input index\r\n */\r\n content.splitBlock = function(inputIndex) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n anchorNodeText = anchorNode.textContent,\r\n caretOffset = selection.anchorOffset,\r\n textBeforeCaret,\r\n textNodeBeforeCaret,\r\n textAfterCaret,\r\n textNodeAfterCaret;\r\n\r\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\r\n\r\n\r\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\r\n textAfterCaret = anchorNodeText.substring(caretOffset);\r\n\r\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\r\n\r\n if (textAfterCaret) {\r\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\r\n }\r\n\r\n var previousChilds = [],\r\n nextChilds = [],\r\n reachedCurrent = false;\r\n\r\n if (textNodeAfterCaret) {\r\n nextChilds.push(textNodeAfterCaret);\r\n }\r\n\r\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\r\n\r\n if ( child != anchorNode ) {\r\n if ( !reachedCurrent ){\r\n previousChilds.push(child);\r\n } else {\r\n nextChilds.push(child);\r\n }\r\n } else {\r\n reachedCurrent = true;\r\n }\r\n\r\n }\r\n\r\n /** Clear current input */\r\n codex.state.inputs[inputIndex].innerHTML = '';\r\n\r\n /**\r\n * Append all childs founded before anchorNode\r\n */\r\n var previousChildsLength = previousChilds.length;\r\n\r\n for(i = 0; i < previousChildsLength; i++) {\r\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\r\n }\r\n\r\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\r\n\r\n /**\r\n * Append text node which is after caret\r\n */\r\n var nextChildsLength = nextChilds.length,\r\n newNode = document.createElement('div');\r\n\r\n for(i = 0; i < nextChildsLength; i++) {\r\n newNode.appendChild(nextChilds[i]);\r\n }\r\n\r\n newNode = newNode.innerHTML;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n /**\r\n * Make new paragraph with text after caret\r\n */\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render({\r\n text : newNode\r\n })\r\n }, true );\r\n\r\n };\r\n\r\n /**\r\n * Merges two blocks — current and target\r\n * If target index is not exist, then previous will be as target\r\n */\r\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\r\n\r\n /** If current input index is zero, then prevent method execution */\r\n if (currentInputIndex === 0) {\r\n return;\r\n }\r\n\r\n var targetInput,\r\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\r\n\r\n if (!targetInputIndex) {\r\n\r\n targetInput = codex.state.inputs[currentInputIndex - 1];\r\n\r\n } else {\r\n\r\n targetInput = codex.state.inputs[targetInputIndex];\r\n\r\n }\r\n\r\n targetInput.innerHTML += currentInputContent;\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Callback for HTML Mutations\r\n * @param {Array} mutation - Mutation Record\r\n */\r\n content.paste = function(mutation) {\r\n\r\n var workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool;\r\n\r\n if (codex.tools[tool].allowedToPaste) {\r\n codex.content.sanitize(mutation.addedNodes);\r\n } else {\r\n codex.content.pasteTextContent(mutation.addedNodes);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * gets only text/plain content of node\r\n * @param {Element} target - HTML node\r\n */\r\n content.pasteTextContent = function(nodes) {\r\n\r\n var node = nodes[0],\r\n textNode = document.createTextNode(node.textContent);\r\n\r\n if (codex.core.isDomNode(node)) {\r\n node.parentNode.replaceChild(textNode, node);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sanitizes HTML content\r\n * @param {Element} target - inserted element\r\n * @uses DFS function for deep searching\r\n */\r\n content.sanitize = function(target) {\r\n\r\n if (!target) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < target.childNodes.length; i++) {\r\n this.dfs(target.childNodes[i]);\r\n }\r\n };\r\n\r\n /**\r\n * Clears styles\r\n * @param {Element|Text}\r\n */\r\n content.clearStyles = function(target) {\r\n\r\n var href,\r\n newNode = null,\r\n blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'],\r\n allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'],\r\n needReplace = !allowedTags.includes(target.tagName),\r\n isDisplayedAsBlock = blockTags.includes(target.tagName);\r\n\r\n if (!codex.core.isDomNode(target)){\r\n return target;\r\n }\r\n\r\n if (!target.parentNode){\r\n return target;\r\n }\r\n\r\n if (needReplace) {\r\n\r\n if (isDisplayedAsBlock) {\r\n\r\n newNode = document.createElement('P');\r\n newNode.innerHTML = target.innerHTML;\r\n target.parentNode.replaceChild(newNode, target);\r\n target = newNode;\r\n\r\n } else {\r\n\r\n newNode = document.createTextNode(` ${target.textContent} `);\r\n newNode.textContent = newNode.textContent.replace(/\\s{2,}/g, ' ');\r\n target.parentNode.replaceChild(newNode, target);\r\n\r\n }\r\n }\r\n\r\n /** keep href attributes of tag A */\r\n if (target.tagName == 'A') {\r\n href = target.getAttribute('href');\r\n }\r\n\r\n /** Remove all tags */\r\n while(target.attributes.length > 0) {\r\n target.removeAttribute(target.attributes[0].name);\r\n }\r\n\r\n /** return href */\r\n if (href) {\r\n target.setAttribute('href', href);\r\n }\r\n\r\n return target;\r\n\r\n };\r\n\r\n /**\r\n * Depth-first search Algorithm\r\n * returns all childs\r\n * @param {Element}\r\n */\r\n content.dfs = function(el) {\r\n\r\n if (!codex.core.isDomNode(el))\r\n return;\r\n\r\n var sanitized = this.clearStyles(el);\r\n\r\n for(var i = 0; i < sanitized.childNodes.length; i++) {\r\n this.dfs(sanitized.childNodes[i]);\r\n }\r\n\r\n };\r\n\r\n return content;\r\n\r\n})({});\r\n\r\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var toolbar = (function(toolbar) {\r\n\r\n toolbar.init = function() {\r\n toolbar.settings = require('./settings');\r\n toolbar.inline = require('./inline');\r\n toolbar.toolbox = require('./toolbox');\r\n };\r\n\r\n /**\r\n * Margin between focused node and toolbar\r\n */\r\n toolbar.defaultToolbarHeight = 49;\r\n\r\n toolbar.defaultOffset = 34;\r\n\r\n toolbar.opened = false;\r\n\r\n toolbar.current = null;\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.open = function (){\r\n\r\n codex.nodes.toolbar.classList.add('opened');\r\n this.opened = true;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.close = function(){\r\n\r\n codex.nodes.toolbar.classList.remove('opened');\r\n\r\n toolbar.opened = false;\r\n toolbar.current = null;\r\n\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].classList.remove('selected');\r\n }\r\n\r\n /** Close toolbox when toolbar is not displayed */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n toolbar.toggle = function(){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open();\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n toolbar.hidePlusButton = function() {\r\n codex.nodes.plusButton.classList.add('hide');\r\n };\r\n\r\n toolbar.showPlusButton = function() {\r\n codex.nodes.plusButton.classList.remove('hide');\r\n };\r\n\r\n /**\r\n * Moving toolbar to the specified node\r\n */\r\n toolbar.move = function() {\r\n\r\n /** Close Toolbox when we move toolbar */\r\n codex.toolbar.toolbox.close();\r\n\r\n if (!codex.content.currentNode) {\r\n return;\r\n }\r\n\r\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\r\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\r\n\r\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\r\n\r\n /** Close trash actions */\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return toolbar;\r\n\r\n})({});\r\n\r\ntoolbar.init();\r\n\r\nmodule.exports = toolbar;\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\r\n\r\n settings.init = function() {\r\n require('../content');\r\n };\r\n\r\n settings.opened = false;\r\n\r\n settings.setting = null;\r\n settings.actions = null;\r\n\r\n settings.cover = null;\r\n\r\n /**\r\n * Append and open settings\r\n */\r\n settings.open = function(toolType){\r\n\r\n /**\r\n * Append settings content\r\n * It's stored in tool.settings\r\n */\r\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\r\n\r\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\r\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\r\n\r\n } else {\r\n\r\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\r\n\r\n }\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n /** Open settings block */\r\n codex.nodes.blockSettings.classList.add('opened');\r\n codex.toolbar.settings.addDefaultSettings();\r\n this.opened = true;\r\n };\r\n\r\n /**\r\n * Close and clear settings\r\n */\r\n settings.close = function(){\r\n\r\n codex.nodes.blockSettings.classList.remove('opened');\r\n codex.nodes.pluginSettings.innerHTML = '';\r\n\r\n this.opened = false;\r\n\r\n };\r\n\r\n /**\r\n * @param {string} toolType - plugin type\r\n */\r\n settings.toggle = function( toolType ){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open(toolType);\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This function adds default core settings\r\n */\r\n settings.addDefaultSettings = function() {\r\n\r\n /** list of default settings */\r\n var feedModeToggler;\r\n\r\n /** Clear block and append initialized settings */\r\n codex.nodes.defaultSettings.innerHTML = '';\r\n\r\n\r\n /** Init all default setting buttons */\r\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\r\n\r\n /**\r\n * Fill defaultSettings\r\n */\r\n\r\n /**\r\n * Button that enables/disables Feed-mode\r\n * Feed-mode means that block will be showed in articles-feed like cover\r\n */\r\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\r\n\r\n };\r\n\r\n /**\r\n * Cover setting.\r\n * This tune highlights block, so that it may be used for showing target block on main page\r\n * Draw different setting when block is marked for main page\r\n * If TRUE, then we show button that removes this selection\r\n * Also defined setting \"Click\" events will be listened and have separate callbacks\r\n *\r\n * @return {Element} node/button that we place in default settings block\r\n */\r\n settings.makeFeedModeToggler = function() {\r\n\r\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\r\n setting,\r\n data;\r\n\r\n if (!isFeedModeActivated) {\r\n\r\n data = {\r\n innerHTML : 'Вывести в ленте'\r\n };\r\n\r\n } else {\r\n\r\n data = {\r\n innerHTML : 'Не выводить в ленте'\r\n };\r\n\r\n }\r\n\r\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\r\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\r\n\r\n return setting;\r\n };\r\n\r\n /**\r\n * Updates Feed-mode\r\n */\r\n settings.updateFeedMode = function() {\r\n\r\n var currentNode = codex.content.currentNode;\r\n\r\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.toolbar.settings.close();\r\n };\r\n\r\n settings.isFeedModeActivated = function() {\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n if (currentBlock) {\r\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Here we will draw buttons and add listeners to components\r\n */\r\n settings.makeRemoveBlockButton = function() {\r\n\r\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\r\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\r\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\r\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\r\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\r\n\r\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\r\n\r\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\r\n\r\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\r\n\r\n actionWrapper.appendChild(confirmAction);\r\n actionWrapper.appendChild(cancelAction);\r\n\r\n removeBlockWrapper.appendChild(settingButton);\r\n removeBlockWrapper.appendChild(actionWrapper);\r\n\r\n /** Save setting */\r\n codex.toolbar.settings.setting = settingButton;\r\n codex.toolbar.settings.actions = actionWrapper;\r\n\r\n return removeBlockWrapper;\r\n\r\n };\r\n\r\n settings.removeButtonClicked = function() {\r\n\r\n var action = codex.toolbar.settings.actions;\r\n\r\n if (action.classList.contains('opened')) {\r\n codex.toolbar.settings.hideRemoveActions();\r\n } else {\r\n codex.toolbar.settings.showRemoveActions();\r\n }\r\n\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n settings.cancelRemovingRequest = function() {\r\n\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n settings.confirmRemovingRequest = function() {\r\n\r\n var currentBlock = codex.content.currentNode,\r\n firstLevelBlocksCount;\r\n\r\n currentBlock.remove();\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n }\r\n\r\n codex.ui.saveInputs();\r\n\r\n codex.toolbar.close();\r\n };\r\n\r\n settings.showRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.add('opened');\r\n };\r\n\r\n settings.hideRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n return settings;\r\n\r\n})({});\r\n\r\nsettings.init();\r\n\r\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","var inline = (function(inline) {\r\n\r\n inline.init = function() {\r\n\r\n };\r\n\r\n inline.buttonsOpened = null;\r\n inline.actionsOpened = null;\r\n inline.wrappersOffset = null;\r\n\r\n /**\r\n * saving selection that need for execCommand for styling\r\n *\r\n */\r\n inline.storedSelection = null,\r\n\r\n /**\r\n * @protected\r\n *\r\n * Open inline toobar\r\n */\r\n inline.show = function() {\r\n\r\n var selectedText = this.getSelectionText(),\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n buttons = codex.nodes.inlineToolbar.buttons;\r\n\r\n if (selectedText.length > 0) {\r\n\r\n /** Move toolbar and open */\r\n codex.toolbar.inline.move();\r\n\r\n /** Open inline toolbar */\r\n toolbar.classList.add('opened');\r\n\r\n /** show buttons of inline toolbar */\r\n codex.toolbar.inline.showButtons();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Closes inline toolbar\r\n */\r\n inline.close = function() {\r\n var toolbar = codex.nodes.inlineToolbar.wrapper;\r\n toolbar.classList.remove('opened');\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Moving toolbar\r\n */\r\n inline.move = function() {\r\n\r\n if (!this.wrappersOffset) {\r\n this.wrappersOffset = this.getWrappersOffset();\r\n }\r\n\r\n var coords = this.getSelectionCoords(),\r\n defaultOffset = 0,\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n newCoordinateX,\r\n newCoordinateY;\r\n\r\n if (toolbar.offsetHeight === 0) {\r\n defaultOffset = 40;\r\n }\r\n\r\n newCoordinateX = coords.x - this.wrappersOffset.left;\r\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\r\n\r\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\r\n\r\n /** Close everything */\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.closeAction();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Tool Clicked\r\n */\r\n\r\n inline.toolClicked = function(event, type) {\r\n\r\n /**\r\n * For simple tools we use default browser function\r\n * For more complicated tools, we should write our own behavior\r\n */\r\n switch (type) {\r\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\r\n case 'addComment' : codex.toolbar.inline.addCommentAction(event, type); break;\r\n default : codex.toolbar.inline.defaultToolAction(type); break;\r\n }\r\n\r\n /**\r\n * highlight buttons\r\n * after making some action\r\n */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saving wrappers offset in DOM\r\n */\r\n inline.getWrappersOffset = function() {\r\n\r\n var wrapper = codex.nodes.wrapper,\r\n offset = this.getOffset(wrapper);\r\n\r\n this.wrappersOffset = offset;\r\n return offset;\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates offset of DOM element\r\n *\r\n * @param el\r\n * @returns {{top: number, left: number}}\r\n */\r\n inline.getOffset = function ( el ) {\r\n\r\n var _x = 0;\r\n var _y = 0;\r\n\r\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\r\n _x += (el.offsetLeft + el.clientLeft);\r\n _y += (el.offsetTop + el.clientTop);\r\n el = el.offsetParent;\r\n }\r\n return { top: _y, left: _x };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates position of selected text\r\n * @returns {{x: number, y: number}}\r\n */\r\n inline.getSelectionCoords = function() {\r\n\r\n var sel = document.selection, range;\r\n var x = 0, y = 0;\r\n\r\n if (sel) {\r\n\r\n if (sel.type != \"Control\") {\r\n range = sel.createRange();\r\n range.collapse(true);\r\n x = range.boundingLeft;\r\n y = range.boundingTop;\r\n }\r\n\r\n } else if (window.getSelection) {\r\n\r\n sel = window.getSelection();\r\n\r\n if (sel.rangeCount) {\r\n\r\n range = sel.getRangeAt(0).cloneRange();\r\n if (range.getClientRects) {\r\n range.collapse(true);\r\n var rect = range.getClientRects()[0];\r\n x = rect.left;\r\n y = rect.top;\r\n }\r\n\r\n }\r\n }\r\n return { x: x, y: y };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Returns selected text as String\r\n * @returns {string}\r\n */\r\n inline.getSelectionText = function getSelectionText(){\r\n\r\n var selectedText = \"\";\r\n\r\n if (window.getSelection){ // all modern browsers and IE9+\r\n selectedText = window.getSelection().toString();\r\n }\r\n\r\n return selectedText;\r\n };\r\n\r\n /** Opens buttons block */\r\n inline.showButtons = function() {\r\n\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.add('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = true;\r\n\r\n /** highlight buttons */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n\r\n };\r\n\r\n /** Makes buttons disappear */\r\n inline.closeButtons = function() {\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.remove('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = false;\r\n };\r\n\r\n /** Open buttons defined action if exist */\r\n inline.showActions = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.classList.add('opened');\r\n\r\n codex.toolbar.inline.actionsOpened = true;\r\n };\r\n\r\n /** Close actions block */\r\n inline.closeAction = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.innerHTML = '';\r\n action.classList.remove('opened');\r\n codex.toolbar.inline.actionsOpened = false;\r\n };\r\n\r\n /** Action for link creation or for setting anchor */\r\n inline.createLinkAction = function(event, type) {\r\n\r\n var isActive = this.isLinkActive();\r\n\r\n var editable = codex.content.currentNode,\r\n storedSelection = codex.toolbar.inline.storedSelection;\r\n\r\n if (isActive) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode;\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * Changing stored selection. if we want to remove anchor from word\r\n * we should remove anchor from whole word, not only selected part.\r\n * The solution is than we get the length of current link\r\n * Change start position to - end of selection minus length of anchor\r\n */\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n\r\n codex.toolbar.inline.defaultToolAction('unlink');\r\n\r\n } else {\r\n\r\n /** Create input and close buttons */\r\n var action = codex.draw.inputForLink();\r\n codex.nodes.inlineToolbar.actions.appendChild(action);\r\n\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.showActions();\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * focus to input\r\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\r\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\r\n */\r\n action.focus();\r\n event.preventDefault();\r\n\r\n /** Callback to link action */\r\n action.addEventListener('keydown', function(event){\r\n\r\n if (event.keyCode == codex.core.keys.ENTER) {\r\n\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n codex.toolbar.inline.setAnchor(action.value);\r\n\r\n /**\r\n * Preventing events that will be able to happen\r\n */\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n codex.toolbar.inline.clearRange();\r\n }\r\n\r\n }, false);\r\n }\r\n };\r\n\r\n inline.isLinkActive = function() {\r\n\r\n var isActive = false;\r\n\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\r\n isActive = true;\r\n }\r\n });\r\n\r\n return isActive;\r\n };\r\n\r\n /** default action behavior of tool */\r\n inline.defaultToolAction = function(type) {\r\n document.execCommand(type, false, null);\r\n };\r\n\r\n inline.addCommentAction = function(event, type) {\r\n\r\n var currentNode = codex.content.currentNode,\r\n selection = window.getSelection();\r\n\r\n codex.toolbar.inline.close();\r\n\r\n codex.comments.add(currentNode, selection);\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets URL\r\n *\r\n * @param {String} url - URL\r\n */\r\n inline.setAnchor = function(url) {\r\n\r\n document.execCommand('createLink', false, url);\r\n\r\n /** Close after URL inserting */\r\n codex.toolbar.inline.closeAction();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saves selection\r\n */\r\n inline.saveSelection = function(containerEl) {\r\n\r\n var range = window.getSelection().getRangeAt(0),\r\n preSelectionRange = range.cloneRange(),\r\n start;\r\n\r\n preSelectionRange.selectNodeContents(containerEl);\r\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\r\n\r\n start = preSelectionRange.toString().length;\r\n\r\n return {\r\n start: start,\r\n end: start + range.toString().length\r\n };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets to previous selection (Range)\r\n *\r\n * @param {Element} containerEl - editable element where we restore range\r\n * @param {Object} savedSel - range basic information to restore\r\n */\r\n inline.restoreSelection = function(containerEl, savedSel) {\r\n\r\n var range = document.createRange(),\r\n charIndex = 0;\r\n\r\n range.setStart(containerEl, 0);\r\n range.collapse(true);\r\n\r\n var nodeStack = [containerEl],\r\n node,\r\n foundStart = false,\r\n stop = false,\r\n nextCharIndex;\r\n\r\n while (!stop && (node = nodeStack.pop())) {\r\n\r\n if (node.nodeType == 3) {\r\n\r\n nextCharIndex = charIndex + node.length;\r\n\r\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\r\n range.setStart(node, savedSel.start - charIndex);\r\n foundStart = true;\r\n }\r\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\r\n range.setEnd(node, savedSel.end - charIndex);\r\n stop = true;\r\n }\r\n charIndex = nextCharIndex;\r\n } else {\r\n var i = node.childNodes.length;\r\n while (i--) {\r\n nodeStack.push(node.childNodes[i]);\r\n }\r\n }\r\n }\r\n\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes all ranges from window selection\r\n */\r\n inline.clearRange = function() {\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * sets or removes hightlight\r\n */\r\n inline.hightlight = function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (document.queryCommandState(dataType)) {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n } else {\r\n codex.toolbar.inline.removeButtonsHighLight(tool);\r\n }\r\n\r\n /**\r\n *\r\n * hightlight for anchors\r\n */\r\n var selection = window.getSelection(),\r\n tag = selection.anchorNode.parentNode;\r\n\r\n if (tag.tagName == 'A' && dataType == 'link') {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Mark button if text is already executed\r\n */\r\n inline.setButtonHighlighted = function(button) {\r\n button.classList.add('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-link');\r\n icon.classList.add('ce-icon-unlink');\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes hightlight\r\n */\r\n inline.removeButtonsHighLight = function(button) {\r\n button.classList.remove('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-unlink');\r\n icon.classList.add('ce-icon-link');\r\n }\r\n };\r\n\r\n\r\n return inline;\r\n})({});\r\n\r\ninline.init();\r\n\r\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","var toolbox = (function(toolbox) {\r\n\r\n toolbox.init = function() {\r\n require('./toolbar');\r\n };\r\n\r\n toolbox.opened = false;\r\n\r\n /** Shows toolbox */\r\n toolbox.open = function() {\r\n\r\n /** Close setting if toolbox is opened */\r\n if (codex.toolbar.settings.opened) {\r\n codex.toolbar.settings.close();\r\n }\r\n\r\n /** display toolbox */\r\n codex.nodes.toolbox.classList.add('opened');\r\n\r\n /** Animate plus button */\r\n codex.nodes.plusButton.classList.add('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = true;\r\n\r\n };\r\n\r\n /** Closes toolbox */\r\n toolbox.close = function() {\r\n\r\n /** Makes toolbox disapear */\r\n codex.nodes.toolbox.classList.remove('opened');\r\n\r\n /** Rotate plus button */\r\n codex.nodes.plusButton.classList.remove('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = false;\r\n\r\n };\r\n\r\n toolbox.leaf = function(){\r\n\r\n var currentTool = codex.toolbar.current,\r\n tools = Object.keys(codex.tools),\r\n barButtons = codex.nodes.toolbarButtons,\r\n nextToolIndex,\r\n hiddenToolsAmount = 0,\r\n toolToSelect;\r\n\r\n /** Count toolbox hidden tools */\r\n for( var tool in codex.tools ) {\r\n if (!codex.tools[tool].displayInToolbox)\r\n hiddenToolsAmount ++;\r\n }\r\n\r\n if ( !currentTool ) {\r\n\r\n /** Get first tool from object*/\r\n for (toolToSelect in barButtons) break;\r\n\r\n } else {\r\n\r\n nextToolIndex = tools.indexOf(currentTool) + 1;\r\n\r\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\r\n\r\n if ( toolIsLastInToolbox ) {\r\n\r\n nextToolIndex = 0;\r\n\r\n /** getting first displayed tool */\r\n for( var tool in codex.tools ) {\r\n\r\n if (codex.tools[tool].displayInToolbox){\r\n break;\r\n }\r\n\r\n nextToolIndex ++;\r\n }\r\n\r\n }\r\n\r\n toolToSelect = tools[nextToolIndex];\r\n\r\n }\r\n\r\n for (var button in barButtons) barButtons[button].classList.remove('selected');\r\n barButtons[toolToSelect].classList.add('selected');\r\n codex.toolbar.current = toolToSelect;\r\n\r\n };\r\n\r\n /**\r\n * Transforming selected node type into selected toolbar element type\r\n * @param {event} event\r\n */\r\n toolbox.toolClicked = function() {\r\n\r\n /**\r\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\r\n */\r\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\r\n tool = codex.tools[codex.toolbar.current],\r\n workingNode = codex.content.currentNode,\r\n currentInputIndex = codex.caret.inputIndex,\r\n newBlockContent,\r\n appendCallback,\r\n blockData;\r\n\r\n /** Make block from plugin */\r\n newBlockContent = tool.make();\r\n\r\n /** information about block */\r\n blockData = {\r\n block : newBlockContent,\r\n type : tool.type,\r\n stretched : false\r\n };\r\n\r\n if (\r\n workingNode &&\r\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\r\n workingNode.textContent.trim() === ''\r\n ){\r\n /** Replace current block */\r\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\r\n\r\n } else {\r\n\r\n /** Insert new Block from plugin */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** increase input index */\r\n currentInputIndex++;\r\n\r\n }\r\n\r\n /** Fire tool append callback */\r\n appendCallback = tool.appendCallback;\r\n\r\n if (appendCallback && typeof appendCallback == 'function') {\r\n appendCallback.call(event);\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n /** Set caret to current block */\r\n codex.caret.setToBlock(currentInputIndex);\r\n\r\n }, 10);\r\n\r\n\r\n /**\r\n * Changing current Node\r\n */\r\n codex.content.workingNodeChanged();\r\n\r\n /**\r\n * Move toolbar when node is changed\r\n */\r\n codex.toolbar.move();\r\n };\r\n\r\n return toolbox;\r\n\r\n})({});\r\n\r\ntoolbox.init();\r\n\r\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","var tools = (function(tools) {\r\n\r\n return tools;\r\n\r\n})({});\r\n\r\nmodule.exports = tools;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var callbacks = (function(callbacks) {\r\n\r\n callbacks.redactorSyncTimeout = null;\r\n\r\n callbacks.globalKeydown = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\r\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\r\n default : codex.callback.defaultKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.globalKeyup = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.UP :\r\n case codex.core.keys.LEFT :\r\n case codex.core.keys.RIGHT :\r\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.tabKeyPressed = function(event){\r\n\r\n if ( !codex.toolbar.opened ) {\r\n codex.toolbar.open();\r\n }\r\n\r\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\r\n codex.toolbar.toolbox.open();\r\n } else {\r\n codex.toolbar.toolbox.leaf();\r\n }\r\n\r\n event.preventDefault();\r\n };\r\n\r\n /**\r\n * ENTER key handler\r\n * Makes new paragraph block\r\n */\r\n callbacks.enterKeyPressed = function(event){\r\n\r\n /** Set current node */\r\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\r\n\r\n if (firstLevelBlocksArea) {\r\n event.preventDefault();\r\n\r\n /**\r\n * it means that we lose input index, saved index before is not correct\r\n * therefore we need to set caret when we insert new block\r\n */\r\n codex.caret.inputIndex = -1;\r\n\r\n codex.callback.enterPressedOnBlock();\r\n return;\r\n }\r\n\r\n if (event.target.contentEditable == 'true') {\r\n\r\n /** Update input index */\r\n codex.caret.saveCurrentInputIndex();\r\n }\r\n\r\n if (!codex.content.currentNode) {\r\n /**\r\n * Enter key pressed in first-level block area\r\n */\r\n codex.callback.enterPressedOnBlock(event);\r\n return;\r\n }\r\n\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\r\n workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool,\r\n isEnterPressedOnToolbar = codex.toolbar.opened &&\r\n codex.toolbar.current &&\r\n event.target == codex.state.inputs[currentInputIndex];\r\n\r\n /** The list of tools which needs the default browser behaviour */\r\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n /**\r\n * When toolbar is opened, select tool instead of making new paragraph\r\n */\r\n if ( isEnterPressedOnToolbar ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n\r\n codex.toolbar.close();\r\n\r\n return;\r\n\r\n }\r\n\r\n /**\r\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\r\n */\r\n if ( event.shiftKey && !enableLineBreaks) {\r\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\r\n event.preventDefault();\r\n\r\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\r\n /** XOR */\r\n return;\r\n }\r\n\r\n var isLastTextNode = false,\r\n currentSelection = window.getSelection(),\r\n currentSelectedNode = currentSelection.anchorNode,\r\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\r\n isTextNodeHasParentBetweenContenteditable = false;\r\n\r\n /**\r\n * Workaround situation when caret at the Text node that has some wrapper Elements\r\n * Split block cant handle this.\r\n * We need to save default behavior\r\n */\r\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\r\n\r\n /**\r\n * Split blocks when input has several nodes and caret placed in textNode\r\n */\r\n if (\r\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\r\n !isTextNodeHasParentBetweenContenteditable &&\r\n !caretAtTheEndOfText\r\n ){\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('Splitting Text node...');\r\n\r\n codex.content.splitBlock(currentInputIndex);\r\n\r\n /** Show plus button when next input after split is empty*/\r\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\r\n codex.toolbar.showPlusButton();\r\n }\r\n\r\n } else {\r\n\r\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\r\n\r\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\r\n\r\n }\r\n\r\n if ( isLastTextNode && caretAtTheEndOfText ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n /** Show plus button with empty block */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n codex.core.log('Default ENTER behavior.');\r\n\r\n }\r\n\r\n }\r\n\r\n /** get all inputs after new appending block */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n callbacks.escapeKeyPressed = function(event){\r\n\r\n /** Close all toolbar */\r\n codex.toolbar.close();\r\n\r\n /** Close toolbox */\r\n codex.toolbar.toolbox.close();\r\n\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.arrowKeyPressed = function(event){\r\n\r\n codex.content.workingNodeChanged();\r\n\r\n /* Closing toolbar */\r\n codex.toolbar.close();\r\n codex.toolbar.move();\r\n\r\n };\r\n\r\n callbacks.defaultKeyPressed = function(event) {\r\n\r\n codex.toolbar.close();\r\n\r\n if (!codex.toolbar.inline.actionsOpened) {\r\n codex.toolbar.inline.close();\r\n codex.content.clearMark();\r\n }\r\n };\r\n\r\n callbacks.redactorClicked = function (event) {\r\n\r\n if (event.target.classList.contains('ce-comments-field')) {event.target.dispatchEvent(event); return;}\r\n\r\n codex.content.workingNodeChanged(event.target);\r\n\r\n codex.ui.saveInputs();\r\n\r\n var selectedText = codex.toolbar.inline.getSelectionText();\r\n\r\n /**\r\n * If selection range took off, then we hide inline toolbar\r\n */\r\n if (selectedText.length === 0) {\r\n codex.toolbar.inline.close();\r\n }\r\n\r\n /** Update current input index in memory when caret focused into existed input */\r\n if (event.target.contentEditable == 'true') {\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }\r\n\r\n if (codex.content.currentNode === null) {\r\n\r\n /**\r\n * If inputs in redactor does not exits, then we put input index 0 not -1\r\n */\r\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\r\n\r\n /** If we have any inputs */\r\n if (codex.state.inputs.length) {\r\n\r\n /** getting firstlevel parent of input */\r\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\r\n }\r\n\r\n /** If input is empty, then we set caret to the last input */\r\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Create new input when caret clicked in redactors area */\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n });\r\n\r\n /** If there is no inputs except inserted */\r\n if (codex.state.inputs.length === 1) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Set caret to this appended input */\r\n codex.caret.setToNextBlock(indexOfLastInput);\r\n }\r\n }\r\n\r\n /**\r\n * Move toolbar to the right position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n\r\n codex.toolbar.open();\r\n\r\n } else {\r\n\r\n /**\r\n * Move toolbar to the new position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n codex.toolbar.open();\r\n\r\n /** Close all panels */\r\n codex.toolbar.settings.close();\r\n codex.toolbar.toolbox.close();\r\n }\r\n\r\n\r\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\r\n\r\n if (inputIsEmpty) {\r\n\r\n /** Show plus button */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n /** Hide plus buttons */\r\n codex.toolbar.hidePlusButton();\r\n\r\n }\r\n\r\n var currentNodeType = codex.content.currentNode.dataset.tool;\r\n\r\n /** Mark current block*/\r\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\r\n\r\n codex.content.markBlock();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This method allows to define, is caret in contenteditable element or not.\r\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\r\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\r\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\r\n * specifies to the first-level block. Other cases we just ignore.\r\n */\r\n callbacks.clickedOnFirstLevelBlockArea = function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n flag = false;\r\n\r\n\r\n if (selection.rangeCount == 0) {\r\n\r\n return true;\r\n\r\n } else {\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n /** Already founded, without loop */\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n while (anchorNode.contentEditable != 'true') {\r\n anchorNode = anchorNode.parentNode;\r\n\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n if (anchorNode == document.body) {\r\n break;\r\n }\r\n }\r\n\r\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\r\n return flag ? false : true;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Toolbar button click handler\r\n * @param this - cursor to the button\r\n */\r\n callbacks.toolbarButtonClicked = function (event) {\r\n\r\n var button = this;\r\n\r\n codex.toolbar.current = button.dataset.type;\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n codex.toolbar.close();\r\n\r\n };\r\n\r\n callbacks.redactorInputEvent = function (event) {\r\n\r\n /**\r\n * Clear previous sync-timeout\r\n */\r\n if (this.redactorSyncTimeout){\r\n clearTimeout(this.redactorSyncTimeout);\r\n }\r\n\r\n /**\r\n * Start waiting to input finish and sync redactor\r\n */\r\n this.redactorSyncTimeout = setTimeout(function() {\r\n\r\n codex.content.sync();\r\n\r\n }, 500);\r\n\r\n };\r\n\r\n /** Show or Hide toolbox when plus button is clicked */\r\n callbacks.plusButtonClicked = function() {\r\n\r\n if (!codex.nodes.toolbox.classList.contains('opened')) {\r\n\r\n codex.toolbar.toolbox.open();\r\n\r\n } else {\r\n\r\n codex.toolbar.toolbox.close();\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Block handlers for KeyDown events\r\n */\r\n callbacks.blockKeydown = function(event, block) {\r\n\r\n switch (event.keyCode){\r\n\r\n case codex.core.keys.DOWN:\r\n case codex.core.keys.RIGHT:\r\n codex.callback.blockRightOrDownArrowPressed(block);\r\n break;\r\n\r\n case codex.core.keys.BACKSPACE:\r\n codex.callback.backspacePressed(block);\r\n break;\r\n\r\n case codex.core.keys.UP:\r\n case codex.core.keys.LEFT:\r\n codex.callback.blockLeftOrUpArrowPressed(block);\r\n break;\r\n\r\n }\r\n };\r\n\r\n /**\r\n * RIGHT or DOWN keydowns on block\r\n */\r\n callbacks.blockRightOrDownArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /** Looking for closest (parent) contentEditable element of focused node */\r\n while (focusedNode.contentEditable != 'true') {\r\n\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent)\r\n {\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n /**\r\n * Do nothing when caret doesn not reaches the end of last child\r\n */\r\n var caretInLastChild = false,\r\n caretAtTheEndOfText = false;\r\n\r\n var lastChild,\r\n deepestTextnode;\r\n\r\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\r\n\r\n if (codex.core.isDomNode(lastChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\r\n\r\n } else {\r\n\r\n deepestTextnode = lastChild;\r\n\r\n }\r\n\r\n caretInLastChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\r\n\r\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\r\n codex.core.log('arrow [down|right] : caret does not reached the end');\r\n return false;\r\n }\r\n\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n\r\n };\r\n\r\n /**\r\n * LEFT or UP keydowns on block\r\n */\r\n callbacks.blockLeftOrUpArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /**\r\n * LEFT or UP not at the beginning\r\n */\r\n if ( selection.anchorOffset !== 0) {\r\n return false;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Do nothing if caret is not at the beginning of first child\r\n */\r\n var caretInFirstChild = false,\r\n caretAtTheBeginning = false;\r\n\r\n var firstChild,\r\n deepestTextnode;\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent) {\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n firstChild = focusedNode.childNodes[0];\r\n\r\n if (codex.core.isDomNode(firstChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\r\n\r\n } else {\r\n\r\n deepestTextnode = firstChild;\r\n\r\n }\r\n\r\n caretInFirstChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheBeginning = selection.anchorOffset === 0;\r\n\r\n if ( caretInFirstChild && caretAtTheBeginning ) {\r\n\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Callback for enter key pressing in first-level block area\r\n */\r\n callbacks.enterPressedOnBlock = function (event) {\r\n\r\n var NEW_BLOCK_TYPE = 'paragraph';\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n };\r\n\r\n callbacks.backspacePressed = function (block) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n range,\r\n selectionLength,\r\n firstLevelBlocksCount;\r\n\r\n if (block.textContent.trim()) {\r\n\r\n range = codex.content.getRange();\r\n selectionLength = range.endOffset - range.startOffset;\r\n\r\n\r\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\r\n\r\n codex.content.mergeBlocks(currentInputIndex);\r\n\r\n } else {\r\n\r\n return;\r\n\r\n }\r\n }\r\n\r\n if (!selectionLength) {\r\n block.remove();\r\n }\r\n\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n\r\n /** Updating inputs state after deleting last block */\r\n codex.ui.saveInputs();\r\n\r\n /** Set to current appended block */\r\n setTimeout(function () {\r\n\r\n codex.caret.setToPreviousBlock(1);\r\n\r\n }, 10);\r\n\r\n } else {\r\n\r\n if (codex.caret.inputIndex !== 0) {\r\n\r\n /** Target block is not first */\r\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\r\n\r\n } else {\r\n\r\n /** If we try to delete first block */\r\n codex.caret.setToNextBlock(codex.caret.inputIndex);\r\n\r\n }\r\n }\r\n\r\n codex.toolbar.move();\r\n\r\n if (!codex.toolbar.opened) {\r\n codex.toolbar.open();\r\n }\r\n\r\n /** Updating inputs state */\r\n codex.ui.saveInputs();\r\n\r\n /** Prevent default browser behaviour */\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n node = codex.state.inputs[currentInputIndex];\r\n\r\n setTimeout(function() {\r\n\r\n codex.content.sanitize(node);\r\n\r\n }, 10);\r\n\r\n };\r\n\r\n callbacks._blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex();\r\n\r\n /**\r\n * create an observer instance\r\n */\r\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\r\n\r\n /**\r\n * configuration of the observer:\r\n */\r\n var config = { attributes: true, childList: true, characterData: false };\r\n\r\n // pass in the target node, as well as the observer options\r\n observer.observe(codex.state.inputs[currentInputIndex], config);\r\n };\r\n\r\n /**\r\n * Sends all mutations to paste handler\r\n */\r\n callbacks.handlePasteEvents = function(mutations) {\r\n mutations.forEach(codex.content.paste);\r\n };\r\n\r\n /**\r\n * Clicks on block settings button\r\n */\r\n callbacks.showSettingsButtonClicked = function(){\r\n\r\n /**\r\n * Get type of current block\r\n * It uses to append settings from tool.settings property.\r\n * ...\r\n * Type is stored in data-type attribute on block\r\n */\r\n var currentToolType = codex.content.currentNode.dataset.tool;\r\n\r\n codex.toolbar.settings.toggle(currentToolType);\r\n\r\n /** Close toolbox when settings button is active */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n callbacks.commentInputChanged = function(e) {\r\n\r\n var input = e.path[0],\r\n wrapper = e.path[1],\r\n sendButton = codex.draw.commentSendButton();\r\n\r\n if (input.value.trim() != '') {\r\n\r\n if (!wrapper.querySelector('.ce-comment__send-button'))\r\n wrapper.appendChild(sendButton);\r\n\r\n } else {\r\n\r\n var button = wrapper.querySelector('.ce-comment__send-button');\r\n if (button)\r\n wrapper.removeChild(button);\r\n\r\n }\r\n\r\n };\r\n\r\n callbacks.commentHovered = function(e) {\r\n\r\n var target = e.target,\r\n commentId = target.dataset.commentId,\r\n commentSelection = codex.comments.getCommentSelectionById(commentId),\r\n comment = codex.comments.getCommentById(commentId);\r\n\r\n if (!commentSelection || !comment) return;\r\n\r\n commentSelection.classList.add('ce-comments--highlight_hover');\r\n comment.classList.add('ce-comment__wrapper_hover')\r\n\r\n };\r\n\r\n callbacks.commentBlured = function(e) {\r\n\r\n var target = e.target,\r\n commentId = target.dataset.commentId,\r\n commentSelection = codex.comments.getCommentSelectionById(commentId),\r\n comment = codex.comments.getCommentById(commentId);\r\n\r\n if (!commentSelection || !comment) return;\r\n\r\n commentSelection.classList.remove('ce-comments--highlight_hover');\r\n comment.classList.remove('ce-comment__wrapper_hover')\r\n\r\n };\r\n\r\n callbacks.commentSendButtonClicked = function(e) {\r\n\r\n var sendButton = e.path[0],\r\n wrapper = e.path[1];\r\n\r\n codex.comments.send(wrapper, sendButton);\r\n\r\n };\r\n\r\n callbacks.commentDeleteButtonClicked = function(e) {\r\n\r\n var wrapper = e.path[1];\r\n\r\n codex.comments.delete(wrapper);\r\n\r\n };\r\n\r\n callbacks.commentEditButtonClicked = function(e) {\r\n\r\n var wrapper = e.path[1],\r\n commentsField = e.path[2];\r\n\r\n codex.comments.edit(wrapper, commentsField);\r\n\r\n };\r\n\r\n return callbacks;\r\n\r\n})({});\r\n\r\nmodule.exports = callbacks;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var draw = (function(draw) {\r\n\r\n /**\r\n * Base editor wrapper\r\n */\r\n draw.wrapper = function () {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className += 'codex-editor';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.commentsSide = function() {\r\n\r\n return draw.node('DIV', 'ce-comments-side');\r\n\r\n };\r\n\r\n /**\r\n * Content-editable holder\r\n */\r\n draw.redactor = function () {\r\n\r\n var redactor = document.createElement('div');\r\n\r\n redactor.className += 'ce-redactor';\r\n\r\n return redactor;\r\n\r\n };\r\n\r\n draw.ceBlock = function() {\r\n\r\n var block = document.createElement('DIV');\r\n\r\n block.className += 'ce_block';\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * Empty toolbar with toggler\r\n */\r\n draw.toolbar = function () {\r\n\r\n var bar = document.createElement('div');\r\n\r\n bar.className += 'ce-toolbar';\r\n\r\n return bar;\r\n };\r\n\r\n draw.toolbarContent = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n wrapper.classList.add('ce-toolbar__content');\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * Inline toolbar\r\n */\r\n draw.inlineToolbar = function() {\r\n\r\n var bar = document.createElement('DIV');\r\n\r\n bar.className += 'ce-toolbar-inline';\r\n\r\n return bar;\r\n\r\n };\r\n\r\n /**\r\n * Wrapper for inline toobar buttons\r\n */\r\n draw.inlineToolbarButtons = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__buttons';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * For some actions\r\n */\r\n draw.inlineToolbarActions = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__actions';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.inputForLink = function() {\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'input';\r\n input.className += 'inputForLink';\r\n input.placeholder = 'Type URL ...';\r\n input.setAttribute('form', 'defaultForm');\r\n\r\n input.setAttribute('autofocus', 'autofocus');\r\n\r\n return input;\r\n\r\n };\r\n\r\n /**\r\n * Block with notifications\r\n */\r\n draw.alertsHolder = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.classList.add('ce_notifications-block');\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * @todo Desc\r\n */\r\n draw.blockButtons = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.className += 'ce-toolbar__actions';\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * Block settings panel\r\n */\r\n draw.blockSettings = function () {\r\n\r\n var settings = document.createElement('div');\r\n\r\n settings.className += 'ce-settings';\r\n\r\n return settings;\r\n };\r\n\r\n draw.defaultSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_default');\r\n\r\n return div;\r\n },\r\n\r\n draw.pluginsSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_plugin');\r\n\r\n return div;\r\n\r\n };\r\n\r\n draw.plusButton = function() {\r\n\r\n var button = document.createElement('span');\r\n\r\n button.className = 'ce-toolbar__plus';\r\n // button.innerHTML = '';\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Settings button in toolbar\r\n */\r\n draw.settingsButton = function () {\r\n\r\n var toggler = document.createElement('span');\r\n\r\n toggler.className = 'ce-toolbar__settings-btn';\r\n\r\n /** Toggler button*/\r\n toggler.innerHTML = '';\r\n\r\n return toggler;\r\n };\r\n\r\n draw.commentsField = function(id) {\r\n\r\n var field = draw.node('DIV', 'ce-comments-field');\r\n\r\n field.dataset.id = id;\r\n\r\n return field;\r\n\r\n };\r\n\r\n draw.commentInput = function(text) {\r\n\r\n var wrapper = draw.node('DIV', 'ce-comment__wrapper'),\r\n input = draw.node('TEXTAREA', 'ce-comment__input', {placeholder: 'New comment'});\r\n\r\n if (text) input.value = text;\r\n\r\n input.addEventListener('input', codex.callback.commentInputChanged);\r\n wrapper.addEventListener('mouseenter', codex.callback.commentHovered);\r\n wrapper.addEventListener('mouseleave', codex.callback.commentBlured);\r\n\r\n wrapper.appendChild(input);\r\n\r\n return wrapper\r\n\r\n };\r\n\r\n draw.commentSelection = function() {\r\n\r\n var wrapper = draw.node('SPAN', 'ce-comments--highlight', {});\r\n\r\n wrapper.addEventListener('mouseenter', codex.callback.commentHovered);\r\n wrapper.addEventListener('mouseleave', codex.callback.commentBlured);\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.commentSendButton = function() {\r\n\r\n var button = draw.node('DIV', 'ce-comment__send-button', {textContent: 'Comment'});\r\n\r\n button.addEventListener('click', codex.callback.commentSendButtonClicked);\r\n\r\n return button;\r\n\r\n };\r\n\r\n draw.commentDeleteButton = function() {\r\n\r\n var button = draw.node('DIV', 'ce-comment__delete-button', {textContent: 'Delete'});\r\n\r\n button.addEventListener('click', codex.callback.commentDeleteButtonClicked);\r\n\r\n return button;\r\n\r\n };\r\n\r\n draw.commentEditButton = function() {\r\n\r\n var button = draw.node('DIV', 'ce-comment__edit-button', {textContent: 'Edit'});\r\n\r\n button.addEventListener('click', codex.callback.commentEditButtonClicked);\r\n\r\n return button;\r\n\r\n };\r\n\r\n draw.commentTmstmp = function(edited, text) {\r\n\r\n var edited = edited ? 'edited ': '',\r\n text = text || edited + new Date().toLocaleDateString('en-US',{\r\n month: 'short',\r\n day: 'numeric',\r\n hour: 'numeric',\r\n minute: 'numeric',\r\n hour12: false\r\n });\r\n\r\n\r\n return draw.node('DIV', 'ce-comment__time', {textContent: text})\r\n\r\n };\r\n\r\n draw.commentText = function(text) {\r\n\r\n return draw.node('DIV', 'ce-comment__text', {textContent: text});\r\n\r\n };\r\n\r\n /**\r\n * Redactor tools wrapper\r\n */\r\n\r\n draw.toolbox = function() {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className = 'ce-toolbar__tools';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tool buttons for toolbox\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n * @returns {Element}\r\n */\r\n draw.toolbarButton = function (type, classname) {\r\n\r\n var button = document.createElement(\"li\"),\r\n tool_icon = document.createElement(\"i\"),\r\n tool_title = document.createElement(\"span\");\r\n\r\n button.dataset.type = type;\r\n button.setAttribute('title', type);\r\n\r\n tool_icon.classList.add(classname);\r\n tool_title.classList.add('ce_toolbar_tools--title');\r\n\r\n\r\n button.appendChild(tool_icon);\r\n button.appendChild(tool_title);\r\n\r\n return button;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tools for inline toolbar\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n */\r\n draw.toolbarButtonInline = function(type, classname) {\r\n var button = document.createElement(\"BUTTON\"),\r\n tool_icon = document.createElement(\"I\");\r\n\r\n button.type = \"button\";\r\n button.dataset.type = type;\r\n tool_icon.classList.add(classname);\r\n\r\n button.appendChild(tool_icon);\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Redactor block\r\n */\r\n draw.block = function (tagName, content) {\r\n\r\n var node = document.createElement(tagName);\r\n\r\n node.innerHTML = content || '';\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Creates Node with passed tagName and className\r\n * @param {string} tagName\r\n * @param {string} className\r\n * @param {object} properties - allow to assign properties\r\n */\r\n draw.node = function( tagName , className , properties ){\r\n\r\n var el = document.createElement( tagName );\r\n\r\n if ( className ) el.className = className;\r\n\r\n if ( properties ) {\r\n\r\n for (var name in properties){\r\n el[name] = properties[name];\r\n }\r\n }\r\n\r\n return el;\r\n };\r\n\r\n draw.pluginsRender = function(type, content) {\r\n\r\n return {\r\n type : type,\r\n block : cEditor.tools[type].render({\r\n text : content\r\n })\r\n };\r\n };\r\n\r\n return draw;\r\n\r\n})({});\r\n\r\nmodule.exports = draw;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var caret = (function(caret) {\r\n\r\n /**\r\n * @var {int} InputIndex - editable element in DOM\r\n */\r\n caret.inputIndex = null;\r\n\r\n /**\r\n * @var {int} offset - caret position in a text node.\r\n */\r\n caret.offset = null;\r\n\r\n /**\r\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\r\n */\r\n caret.focusedNodeIndex = null;\r\n\r\n /**\r\n * Creates Document Range and sets caret to the element.\r\n * @protected\r\n * @uses caret.save — if you need to save caret position\r\n * @param {Element} el - Changed Node.\r\n */\r\n caret.set = function( el , index, offset) {\r\n\r\n offset = offset || this.offset || 0;\r\n index = index || this.focusedNodeIndex || 0;\r\n\r\n var childs = el.childNodes,\r\n nodeToSet;\r\n\r\n if ( childs.length === 0 ) {\r\n\r\n nodeToSet = el;\r\n\r\n } else {\r\n\r\n nodeToSet = childs[index];\r\n\r\n }\r\n\r\n /** If Element is INPUT */\r\n if (el.tagName == 'INPUT') {\r\n el.focus();\r\n return;\r\n }\r\n\r\n if (codex.core.isDomNode(nodeToSet)) {\r\n\r\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\r\n }\r\n\r\n var range = document.createRange(),\r\n selection = window.getSelection();\r\n\r\n setTimeout(function() {\r\n\r\n range.setStart(nodeToSet, offset);\r\n range.setEnd(nodeToSet, offset);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }, 20);\r\n };\r\n\r\n /**\r\n * @protected\r\n * Updates index of input and saves it in caret object\r\n */\r\n caret.saveCurrentInputIndex = function () {\r\n\r\n /** Index of Input that we paste sanitized content */\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n if (!focusedNode){\r\n return;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n this.inputIndex = editableElementIndex;\r\n };\r\n\r\n /**\r\n * Returns current input index (caret object)\r\n */\r\n caret.getCurrentInputIndex = function() {\r\n return this.inputIndex;\r\n };\r\n\r\n /**\r\n * @param {int} index - index of first-level block after that we set caret into next input\r\n */\r\n caret.setToNextBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n nextInput = inputs[index + 1];\r\n\r\n if (!nextInput) {\r\n codex.core.log('We are reached the end');\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!nextInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n nextInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index + 1;\r\n codex.caret.set(nextInput, 0, 0);\r\n codex.content.workingNodeChanged(nextInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of target input.\r\n * Sets caret to input with this index\r\n */\r\n caret.setToBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n targetInput = inputs[index];\r\n\r\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\r\n\r\n if ( !targetInput ) {\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!targetInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n targetInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index;\r\n codex.caret.set(targetInput, 0, 0);\r\n codex.content.workingNodeChanged(targetInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of input\r\n */\r\n caret.setToPreviousBlock = function(index) {\r\n\r\n index = index || 0;\r\n\r\n var inputs = codex.state.inputs,\r\n previousInput = inputs[index - 1],\r\n lastChildNode,\r\n lengthOfLastChildNode,\r\n emptyTextElement;\r\n\r\n\r\n if (!previousInput) {\r\n codex.core.log('We are reached first node');\r\n return;\r\n }\r\n\r\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\r\n lengthOfLastChildNode = lastChildNode.length;\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!previousInput.childNodes.length) {\r\n\r\n emptyTextElement = document.createTextNode('');\r\n previousInput.appendChild(emptyTextElement);\r\n }\r\n codex.caret.inputIndex = index - 1;\r\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\r\n codex.content.workingNodeChanged(inputs[index - 1]);\r\n };\r\n\r\n caret.position = {\r\n\r\n atStart : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode,\r\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\r\n pluginsRender = firstLevelBlock.childNodes[0];\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\r\n isOffsetZero = anchorOffset === 0;\r\n\r\n return isFirstNode && isOffsetZero;\r\n\r\n },\r\n\r\n atTheEnd : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode;\r\n\r\n /** Caret is at the end of input */\r\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\r\n }\r\n };\r\n\r\n return caret;\r\n\r\n})({});\r\n\r\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var notifications = (function(notifications) {\r\n\r\n /**\r\n * Error notificator. Shows block with message\r\n * @protected\r\n */\r\n notifications.errorThrown = function(errorMsg, event) {\r\n\r\n codex.notifications.send('This action is not available currently', event.type, false);\r\n\r\n };\r\n\r\n /**\r\n * Appends notification with different types\r\n * @param message {string} - Error or alert message\r\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\r\n * @param append {boolean} - can be True or False when notification should be inserted after\r\n */\r\n notifications.send = function(message, type, append) {\r\n\r\n var notification = codex.draw.block('div');\r\n\r\n notification.textContent = message;\r\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\r\n\r\n if (!append) {\r\n codex.nodes.notifications.innerHTML = '';\r\n }\r\n\r\n codex.nodes.notifications.appendChild(notification);\r\n\r\n setTimeout(function () {\r\n notification.remove();\r\n }, 3000);\r\n\r\n };\r\n\r\n return notifications;\r\n\r\n})({});\r\n\r\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var parser = (function(parser) {\r\n\r\n /**\r\n * Splits content by `\\n` and returns blocks\r\n */\r\n parser.getSeparatedTextFromContent = function(content) {\r\n return content.split('\\n');\r\n };\r\n\r\n /** inserting text */\r\n parser.insertPastedContent = function(content) {\r\n\r\n var blocks = this.getSeparatedTextFromContent(content),\r\n i,\r\n inputIndex = cEditor.caret.getCurrentInputIndex(),\r\n textNode,\r\n parsedTextContent;\r\n\r\n for(i = 0; i < blocks.length; i++) {\r\n\r\n blocks[i].trim();\r\n\r\n if (blocks[i]) {\r\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\r\n cEditor.content.insertBlock(data);\r\n }\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously parses textarea input string to HTML editor blocks\r\n */\r\n parser.parseTextareaContent = function () {\r\n\r\n var initialContent = cEditor.nodes.textarea.value;\r\n\r\n if ( initialContent.trim().length === 0 ) return true;\r\n\r\n\r\n cEditor.parser\r\n\r\n /** Get child nodes async-aware */\r\n .getNodesFromString(initialContent)\r\n\r\n /** Then append nodes to the redactor */\r\n .then(cEditor.parser.appendNodesToRedactor)\r\n\r\n /** Write log if something goes wrong */\r\n .catch(function(error) {\r\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Parses string to nodeList\r\n * @param string inputString\r\n * @return Primise -> nodeList\r\n */\r\n parser.getNodesFromString = function (inputString) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n var contentHolder = document.createElement('div');\r\n\r\n contentHolder.innerHTML = inputString;\r\n\r\n /**\r\n * Returning childNodes will include:\r\n * - Elements (html-tags),\r\n * - Texts (empty-spaces or non-wrapped strings )\r\n * - Comments and other\r\n */\r\n return contentHolder.childNodes;\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Appends nodes to the redactor\r\n * @param nodeList nodes - list for nodes to append\r\n */\r\n parser.appendNodesToRedactor = function(nodes) {\r\n\r\n /**\r\n * Sequence of one-by-one nodes appending\r\n * Uses to save blocks order after async-handler\r\n */\r\n var nodeSequence = Promise.resolve();\r\n\r\n\r\n for (var index = 0; index < nodes.length ; index++ ) {\r\n\r\n /** Add node to sequence at specified index */\r\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Append node at specified index\r\n */\r\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\r\n\r\n /** We need to append node to sequence */\r\n nodeSequence\r\n\r\n /** first, get node async-aware */\r\n .then(function() {\r\n\r\n return cEditor.parser.getNodeAsync(nodes , index);\r\n\r\n })\r\n\r\n /**\r\n * second, compose editor-block from node\r\n * and append it to redactor\r\n */\r\n .then(function(node){\r\n\r\n var block = cEditor.parser.createBlockByDomNode(node);\r\n\r\n if ( cEditor.core.isDomNode(block) ) {\r\n\r\n block.contentEditable = \"true\";\r\n\r\n /** Mark node as redactor block*/\r\n block.classList.add('ce-block');\r\n\r\n /** Append block to the redactor */\r\n cEditor.nodes.redactor.appendChild(block);\r\n\r\n /** Save block to the cEditor.state array */\r\n cEditor.state.blocks.push(block);\r\n\r\n return block;\r\n\r\n }\r\n return null;\r\n })\r\n\r\n .then(cEditor.ui.addBlockHandlers)\r\n\r\n /** Log if something wrong with node */\r\n .catch(function(error) {\r\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously returns node from nodeList by index\r\n * @return Promise to node\r\n */\r\n parser.getNodeAsync = function (nodeList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return nodeList.item(index);\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Creates editor block by DOM node\r\n *\r\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\r\n * other wrapps with

-tag\r\n *\r\n * @param DOMnode node\r\n * @return First-level node (paragraph)\r\n */\r\n parser.createBlockByDomNode = function (node) {\r\n\r\n /** First level nodes already appears as blocks */\r\n if ( cEditor.parser.isFirstLevelBlock(node) ){\r\n\r\n /** Save plugin type in data-type */\r\n node = this.storeBlockType(node);\r\n\r\n return node;\r\n }\r\n\r\n /** Other nodes wraps into parent block (paragraph-tag) */\r\n var parentBlock,\r\n nodeContent = node.textContent.trim(),\r\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\r\n\r\n\r\n /** Skip empty textNodes with space-symbols */\r\n if (isPlainTextNode && !nodeContent.length) return null;\r\n\r\n /** Make

tag */\r\n parentBlock = cEditor.draw.block('P');\r\n\r\n if (isPlainTextNode){\r\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\r\n } else {\r\n parentBlock.appendChild(node);\r\n }\r\n\r\n /** Save plugin type in data-type */\r\n parentBlock = this.storeBlockType(parentBlock);\r\n\r\n return parentBlock;\r\n\r\n };\r\n\r\n /**\r\n * It's a crutch\r\n * - - - - - - -\r\n * We need block type stored as data-attr\r\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\r\n * Remove it after updating parser module for the block-oriented structure:\r\n * - each block must have stored type\r\n * @param {Element} node\r\n */\r\n parser.storeBlockType = function (node) {\r\n\r\n switch (node.tagName) {\r\n case 'P' : node.dataset.tool = 'paragraph'; break;\r\n case 'H1':\r\n case 'H2':\r\n case 'H3':\r\n case 'H4':\r\n case 'H5':\r\n case 'H6': node.dataset.tool = 'header'; break;\r\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\r\n case 'CODE': node.dataset.tool = 'code'; break;\r\n }\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Check DOM node for display style: separated block or child-view\r\n */\r\n parser.isFirstLevelBlock = function (node) {\r\n\r\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\r\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\r\n\r\n };\r\n\r\n return parser;\r\n\r\n})({});\r\n\r\nmodule.exports = parser;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","var comments = function(comments) {\r\n\r\n comments.add = function(node, selection) {\r\n\r\n var blockId = node.dataset.id,\r\n commentInput = codex.draw.commentInput(),\r\n commentId = +new Date(),\r\n highlight = codex.draw.commentSelection(),\r\n range = selection.getRangeAt(0);\r\n\r\n commentInput.dataset.blockId = blockId;\r\n commentInput.dataset.commentId = commentId;\r\n commentInput.dataset.selectionStart = range.startOffset;\r\n commentInput.dataset.selectionEnd = range.endOffset;\r\n\r\n highlight.dataset.commentId = commentId;\r\n\r\n range.surroundContents(highlight);\r\n\r\n codex.nodes.commentsSide.appendChild(commentInput);\r\n commentInput.querySelector('.ce-comment__input').focus();\r\n };\r\n\r\n comments.send = function(wrapper, sendButton) {\r\n\r\n var input = wrapper.querySelector('.ce-comment__input'),\r\n time = codex.draw.commentTmstmp(wrapper.dataset.edited),\r\n text = codex.draw.commentText(input.value),\r\n deleteButton = codex.draw.commentDeleteButton(),\r\n editButton = codex.draw.commentEditButton();\r\n\r\n\r\n wrapper.replaceChild(text, input);\r\n wrapper.replaceChild(time, sendButton);\r\n wrapper.appendChild(deleteButton);\r\n wrapper.appendChild(editButton);\r\n\r\n };\r\n\r\n comments.edit = function(wrapper, commentsField) {\r\n\r\n var text = wrapper.querySelector('.ce-comment__text').textContent,\r\n sendButton = codex.draw.commentSendButton(),\r\n newWrapper = codex.draw.commentInput(text);\r\n\r\n newWrapper.dataset.edited = true;\r\n newWrapper.appendChild(sendButton);\r\n\r\n commentsField.replaceChild(newWrapper, wrapper);\r\n newWrapper.querySelector('.ce-comment__input').focus();\r\n\r\n };\r\n\r\n comments.delete = function(wrapper) {\r\n\r\n var commentId = wrapper.dataset.commentId,\r\n commentSelection = codex.comments.getCommentSelectionById(commentId);\r\n\r\n commentSelection.className = '';\r\n\r\n wrapper.parentNode.removeChild(wrapper);\r\n\r\n };\r\n\r\n comments.makeComment = function(commentData) {\r\n\r\n var wrapper = codex.draw.node('DIV', 'ce-comment__wrapper'),\r\n text = codex.draw.commentText(commentData.text),\r\n time = codex.draw.commentTmstmp(false, commentData.time),\r\n deleteBtn = codex.draw.commentDeleteButton(),\r\n editBtn = codex.draw.commentEditButton();\r\n\r\n wrapper.dataset.blockId = commentData['block-id'];\r\n wrapper.dataset.commentId = commentData['comment-id'];\r\n wrapper.dataset.selectionStart = commentData['selection-start'];\r\n wrapper.dataset.selectionEnd = commentData['selection-end'];\r\n\r\n wrapper.addEventListener('mouseenter', codex.callback.commentHovered);\r\n wrapper.addEventListener('mouseleave', codex.callback.commentBlured);\r\n\r\n wrapper.appendChild(text);\r\n wrapper.appendChild(time);\r\n wrapper.appendChild(deleteBtn);\r\n wrapper.appendChild(editBtn);\r\n\r\n comments.createCommentSelection(commentData['comment-id'], commentData['block-id'], commentData['selection-start'], commentData['selection-end']);\r\n\r\n codex.nodes.commentsSide.appendChild(wrapper);\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n comments.getBlockById = function(id) {\r\n return codex.nodes.redactor.querySelector('.ce-block[data-id=\"'+id+'\"]');\r\n };\r\n\r\n comments.getCommentSelectionById = function(id) {\r\n return codex.nodes.redactor.querySelector('span[data-comment-id=\"'+id+'\"]');\r\n };\r\n\r\n comments.getCommentById = function(id) {\r\n return codex.nodes.commentsSide.querySelector('div[data-comment-id=\"'+id+'\"]');\r\n };\r\n\r\n comments.createCommentSelection = function(commentId, blockId, selectionStart, selectionEnd) {\r\n\r\n var block = comments.getBlockById(blockId),\r\n range = document.createRange(),\r\n highlight = codex.draw.commentSelection(),\r\n textNode = codex.content.getDeepestTextNodeFromPosition(block, 0);\r\n\r\n highlight.dataset.commentId = commentId;\r\n\r\n range.setStart(textNode, selectionStart);\r\n range.setEnd(textNode, selectionEnd);\r\n\r\n range.surroundContents(highlight);\r\n\r\n };\r\n\r\n return comments;\r\n\r\n}({});\r\n\r\nmodule.exports = comments;\n\n\n// WEBPACK FOOTER //\n// ./modules/comments.js"],"sourceRoot":""} \ No newline at end of file diff --git a/editor.js b/editor.js index 9961369f..0c8aa412 100644 --- a/editor.js +++ b/editor.js @@ -45,6 +45,7 @@ var codex = (function(codex){ codex.nodes = { textarea : null, wrapper : null, + commentsSide : null, toolbar : null, inlineToolbar : { wrapper : null, diff --git a/modules/callbacks.js b/modules/callbacks.js index 4ca6426f..c1bab34a 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -217,6 +217,8 @@ var callbacks = (function(callbacks) { callbacks.redactorClicked = function (event) { + if (event.target.classList.contains('ce-comments-field')) {event.target.dispatchEvent(event); return;} + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -749,15 +751,78 @@ var callbacks = (function(callbacks) { }; - /** - * Clicks on block comment button - */ - callbacks.showCommentButtonClicked = function(){ + callbacks.commentInputChanged = function(e) { - codex.comments.add(codex.content.currentNode); + var input = e.path[0], + wrapper = e.path[1], + sendButton = codex.draw.commentSendButton(); - codex.toolbar.toolbox.close(); - codex.toolbar.settings.hideRemoveActions(); + if (input.value.trim() != '') { + + if (!wrapper.querySelector('.ce-comment__send-button')) + wrapper.appendChild(sendButton); + + } else { + + var button = wrapper.querySelector('.ce-comment__send-button'); + if (button) + wrapper.removeChild(button); + + } + + }; + + callbacks.commentHovered = function(e) { + + var target = e.target, + commentId = target.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId), + comment = codex.comments.getCommentById(commentId); + + if (!commentSelection || !comment) return; + + commentSelection.classList.add('ce-comments--highlight_hover'); + comment.classList.add('ce-comment__wrapper_hover') + + }; + + callbacks.commentBlured = function(e) { + + var target = e.target, + commentId = target.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId), + comment = codex.comments.getCommentById(commentId); + + if (!commentSelection || !comment) return; + + commentSelection.classList.remove('ce-comments--highlight_hover'); + comment.classList.remove('ce-comment__wrapper_hover') + + }; + + callbacks.commentSendButtonClicked = function(e) { + + var sendButton = e.path[0], + wrapper = e.path[1]; + + codex.comments.send(wrapper, sendButton); + + }; + + callbacks.commentDeleteButtonClicked = function(e) { + + var wrapper = e.path[1]; + + codex.comments.delete(wrapper); + + }; + + callbacks.commentEditButtonClicked = function(e) { + + var wrapper = e.path[1], + commentsField = e.path[2]; + + codex.comments.edit(wrapper, commentsField); }; diff --git a/modules/comments.js b/modules/comments.js index 29a19401..e676c2e0 100644 --- a/modules/comments.js +++ b/modules/comments.js @@ -1,16 +1,124 @@ var comments = function(comments) { - comments.add = function(node) { + comments.add = function(node, selection) { - var id = node.dataset.id, - commentInput = codex.draw.commentInput(); + var blockId = node.dataset.id, + commentInput = codex.draw.commentInput(), + commentId = +new Date(), + highlight = codex.draw.commentSelection(), + range = selection.getRangeAt(0); - commentInput.dataset.blockId = id; + commentInput.dataset.blockId = blockId; + commentInput.dataset.commentId = commentId; + commentInput.dataset.selectionStart = range.startOffset; + commentInput.dataset.selectionEnd = range.endOffset; - node.insertBefore(commentInput, node.firstChild); + highlight.dataset.commentId = commentId; + + range.surroundContents(highlight); + + codex.nodes.commentsSide.appendChild(commentInput); + commentInput.querySelector('.ce-comment__input').focus(); + }; + + comments.send = function(wrapper, sendButton) { + + var input = wrapper.querySelector('.ce-comment__input'), + time = codex.draw.commentTmstmp(wrapper.dataset.edited), + text = codex.draw.commentText(input.value), + deleteButton = codex.draw.commentDeleteButton(), + editButton = codex.draw.commentEditButton(); + + + wrapper.replaceChild(text, input); + wrapper.replaceChild(time, sendButton); + wrapper.appendChild(deleteButton); + wrapper.appendChild(editButton); }; + comments.edit = function(wrapper, commentsField) { + + var text = wrapper.querySelector('.ce-comment__text').textContent, + sendButton = codex.draw.commentSendButton(), + newWrapper = codex.draw.commentInput(text); + + newWrapper.dataset.edited = true; + newWrapper.appendChild(sendButton); + + commentsField.replaceChild(newWrapper, wrapper); + newWrapper.querySelector('.ce-comment__input').focus(); + + }; + + comments.delete = function(wrapper) { + + var commentId = wrapper.dataset.commentId, + commentSelection = codex.comments.getCommentSelectionById(commentId); + + commentSelection.className = ''; + + wrapper.parentNode.removeChild(wrapper); + + }; + + comments.makeComment = function(commentData) { + + var wrapper = codex.draw.node('DIV', 'ce-comment__wrapper'), + text = codex.draw.commentText(commentData.text), + time = codex.draw.commentTmstmp(false, commentData.time), + deleteBtn = codex.draw.commentDeleteButton(), + editBtn = codex.draw.commentEditButton(); + + wrapper.dataset.blockId = commentData['block-id']; + wrapper.dataset.commentId = commentData['comment-id']; + wrapper.dataset.selectionStart = commentData['selection-start']; + wrapper.dataset.selectionEnd = commentData['selection-end']; + + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); + + wrapper.appendChild(text); + wrapper.appendChild(time); + wrapper.appendChild(deleteBtn); + wrapper.appendChild(editBtn); + + comments.createCommentSelection(commentData['comment-id'], commentData['block-id'], commentData['selection-start'], commentData['selection-end']); + + codex.nodes.commentsSide.appendChild(wrapper); + + return wrapper; + + }; + + comments.getBlockById = function(id) { + return codex.nodes.redactor.querySelector('.ce-block[data-id="'+id+'"]'); + }; + + comments.getCommentSelectionById = function(id) { + return codex.nodes.redactor.querySelector('span[data-comment-id="'+id+'"]'); + }; + + comments.getCommentById = function(id) { + return codex.nodes.commentsSide.querySelector('div[data-comment-id="'+id+'"]'); + }; + + comments.createCommentSelection = function(commentId, blockId, selectionStart, selectionEnd) { + + var block = comments.getBlockById(blockId), + range = document.createRange(), + highlight = codex.draw.commentSelection(), + textNode = codex.content.getDeepestTextNodeFromPosition(block, 0); + + highlight.dataset.commentId = commentId; + + range.setStart(textNode, selectionStart); + range.setEnd(textNode, selectionEnd); + + range.surroundContents(highlight); + + }; + return comments; }({}); diff --git a/modules/content.js b/modules/content.js index 6ee2eb53..83eb7b36 100644 --- a/modules/content.js +++ b/modules/content.js @@ -177,10 +177,11 @@ var content = (function(content) { var workingBlock = codex.content.currentNode, newBlockContent = blockData.block, blockType = blockData.type, + blockId = blockData.id, cover = blockData.cover, isStretched = blockData.stretched; - var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); + var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched, blockId); if (cover === true) { newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); @@ -353,7 +354,7 @@ var content = (function(content) { /** * @private */ - content.composeNewBlock = function (block, tool, isStretched) { + content.composeNewBlock = function (block, tool, isStretched, id) { var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}), blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {}); @@ -366,7 +367,7 @@ var content = (function(content) { } newBlock.dataset.tool = tool; - newBlock.dataset.id = +(new Date); + newBlock.dataset.id = id || +(new Date); return newBlock; }; diff --git a/modules/draw.js b/modules/draw.js index 596fe059..e46ae13e 100644 --- a/modules/draw.js +++ b/modules/draw.js @@ -13,6 +13,12 @@ var draw = (function(draw) { }; + draw.commentsSide = function() { + + return draw.node('DIV', 'ce-comments-side'); + + }; + /** * Content-editable holder */ @@ -190,20 +196,94 @@ var draw = (function(draw) { return toggler; }; + draw.commentsField = function(id) { - draw.commentButton = function() { - var btn = draw.node('SPAN', 'ce-toolbar__comment-btn', {innerHTML: ''}); + var field = draw.node('DIV', 'ce-comments-field'); + + field.dataset.id = id; + + return field; - return btn; }; - draw.commentInput = function() { - var wrapper = draw.node('DIV', 'ce-comment__wrapper', {textContent: 'Ваш комментарий:'}), - input = draw.node('TEXTAREA', 'ce-comment__input'); + draw.commentInput = function(text) { + + var wrapper = draw.node('DIV', 'ce-comment__wrapper'), + input = draw.node('TEXTAREA', 'ce-comment__input', {placeholder: 'New comment'}); + + if (text) input.value = text; + + input.addEventListener('input', codex.callback.commentInputChanged); + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); wrapper.appendChild(input); return wrapper + + }; + + draw.commentSelection = function() { + + var wrapper = draw.node('SPAN', 'ce-comments--highlight', {}); + + wrapper.addEventListener('mouseenter', codex.callback.commentHovered); + wrapper.addEventListener('mouseleave', codex.callback.commentBlured); + + return wrapper; + + }; + + draw.commentSendButton = function() { + + var button = draw.node('DIV', 'ce-comment__send-button', {textContent: 'Comment'}); + + button.addEventListener('click', codex.callback.commentSendButtonClicked); + + return button; + + }; + + draw.commentDeleteButton = function() { + + var button = draw.node('DIV', 'ce-comment__delete-button', {textContent: 'Delete'}); + + button.addEventListener('click', codex.callback.commentDeleteButtonClicked); + + return button; + + }; + + draw.commentEditButton = function() { + + var button = draw.node('DIV', 'ce-comment__edit-button', {textContent: 'Edit'}); + + button.addEventListener('click', codex.callback.commentEditButtonClicked); + + return button; + + }; + + draw.commentTmstmp = function(edited, text) { + + var edited = edited ? 'edited ': '', + text = text || edited + new Date().toLocaleDateString('en-US',{ + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + hour12: false + }); + + + return draw.node('DIV', 'ce-comment__time', {textContent: text}) + + }; + + draw.commentText = function(text) { + + return draw.node('DIV', 'ce-comment__text', {textContent: text}); + }; /** diff --git a/modules/renderer.js b/modules/renderer.js index 4c19c4cc..1bde02e8 100644 --- a/modules/renderer.js +++ b/modules/renderer.js @@ -56,6 +56,16 @@ var renderer = (function(renderer) { }; + renderer.appendComments = function() { + + var comments = codex.state.blocks.comments; + + for (var i = 0; i < comments.length; i++) { + codex.comments.makeComment(comments[i]); + } + + }; + /** * Append node at specified index */ @@ -82,7 +92,7 @@ var renderer = (function(renderer) { .then(function(blockData){ /** - * blockData has 'block', 'type' and 'stretched' information + * blockData has 'block', 'type', 'id' and 'stretched' information */ codex.content.insertBlock(blockData); @@ -96,6 +106,8 @@ var renderer = (function(renderer) { codex.core.log('Node skipped while parsing because %o', 'error', error); }); + return nodeSequence; + }; /** @@ -128,7 +140,8 @@ var renderer = (function(renderer) { /** New parser */ var pluginName = blockData.type, - cover = blockData.cover; + cover = blockData.cover, + id = blockData.id || +new Date(); /** Get first key of object that stores plugin name */ // for (var pluginName in blockData) break; @@ -155,7 +168,8 @@ var renderer = (function(renderer) { type : pluginName, block : block, stretched : stretched, - cover : cover + cover : cover, + id: id }; }; diff --git a/modules/saver.js b/modules/saver.js index 507cb183..89d8ada7 100644 --- a/modules/saver.js +++ b/modules/saver.js @@ -84,12 +84,11 @@ var saver = (function(saver) { } /** Result saver */ - var blockContent = block.childNodes[0], + var blockContent = block.childNodes[1], pluginsContent = blockContent.childNodes[0], savedData = codex.tools[pluginName].save(pluginsContent), output; - output = { type: pluginName, data: savedData @@ -98,23 +97,40 @@ var saver = (function(saver) { /** Marks Blocks that will be in main page */ output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); + output.id = block.dataset.id; + codex.state.jsonOutput.push(output); }; saver.saveComments = function() { - var comments = codex.nodes.redactor.querySelectorAll('.ce-comment__wrapper'); + var comments = [], + wrappers = codex.nodes.commentsSide.querySelectorAll('.ce-comment__wrapper'); - for (var i = 0; i < comments.length; i++) { + for (var i = 0; i < wrappers.length; i++) { - var comment = { - blockId: comments[i].dataset.blockId, - text: comments[i].querySelector('.ce-comment__input').value - }; + var text = wrappers[i].querySelector('.ce-comment__text'), + time = wrappers[i].querySelector('.ce-comment__time'), + blockId = wrappers[i].dataset.blockId, + commentId = wrappers[i].dataset.commentId, + selectionStart = wrappers[i].dataset.selectionStart, + selectionEnd = wrappers[i].dataset.selectionEnd; - codex.state.comments.push(comment); + if (text && time) { + comments.push({ + text : text.textContent, + time : time.textContent, + 'block-id' : blockId, + 'comment-id' : commentId, + 'selection-start': selectionStart, + 'selection-end': selectionEnd + }); + } } + + codex.state.comments = comments; + }; return saver; diff --git a/modules/toolbar/inline.js b/modules/toolbar/inline.js index 00182722..81a7bba3 100644 --- a/modules/toolbar/inline.js +++ b/modules/toolbar/inline.js @@ -95,6 +95,7 @@ var inline = (function(inline) { */ switch (type) { case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break; + case 'addComment' : codex.toolbar.inline.addCommentAction(event, type); break; default : codex.toolbar.inline.defaultToolAction(type); break; } @@ -319,6 +320,17 @@ var inline = (function(inline) { document.execCommand(type, false, null); }; + inline.addCommentAction = function(event, type) { + + var currentNode = codex.content.currentNode, + selection = window.getSelection(); + + codex.toolbar.inline.close(); + + codex.comments.add(currentNode, selection); + + }; + /** * @private * diff --git a/modules/ui.js b/modules/ui.js index 7f0bd0ca..a80ba86f 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -48,13 +48,13 @@ var ui = (function(ui){ toolbar, toolbarContent, inlineToolbar, + commentsSide, redactor, ceBlock, notifications, blockButtons, blockSettings, showSettingsButton, - showCommentButton, showTrashButton, toolbox, plusButton; @@ -75,12 +75,12 @@ var ui = (function(ui){ inlineToolbar = codex.draw.inlineToolbar(); plusButton = codex.draw.plusButton(); showSettingsButton = codex.draw.settingsButton(); - showCommentButton = codex.draw.commentButton(); showTrashButton = codex.toolbar.settings.makeRemoveBlockButton(); blockSettings = codex.draw.blockSettings(); blockButtons = codex.draw.blockButtons(); toolbox = codex.draw.toolbox(); redactor = codex.draw.redactor(); + commentsSide = codex.draw.commentsSide(); /** settings */ var defaultSettings = codex.draw.defaultSettings(), @@ -95,7 +95,6 @@ var ui = (function(ui){ */ blockButtons.appendChild(showSettingsButton); blockButtons.appendChild(showTrashButton); - blockButtons.appendChild(showCommentButton); blockButtons.appendChild(blockSettings); /** Append plus button */ @@ -110,12 +109,15 @@ var ui = (function(ui){ /** Append toolbarContent to toolbar */ toolbar.appendChild(toolbarContent); + wrapper.appendChild(commentsSide); + wrapper.appendChild(toolbar); wrapper.appendChild(redactor); /** Save created ui-elements to static nodes state */ codex.nodes.wrapper = wrapper; + codex.nodes.commentsSide = commentsSide; codex.nodes.toolbar = toolbar; codex.nodes.plusButton = plusButton; codex.nodes.toolbox = toolbox; @@ -124,7 +126,6 @@ var ui = (function(ui){ codex.nodes.defaultSettings = defaultSettings; codex.nodes.showSettingsButton = showSettingsButton; codex.nodes.showTrashButton = showTrashButton; - codex.nodes.showCommentButton = showCommentButton; codex.nodes.redactor = redactor; @@ -227,6 +228,11 @@ var ui = (function(ui){ link: { icon : 'ce-icon-link', command : 'createLink', + }, + + comment: { + icon : 'ce-icon-newspaper', + command : 'addComment' } }; @@ -281,12 +287,6 @@ var ui = (function(ui){ */ codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false ); - /** - * Clicks to COMMENT button in toolbar - */ - codex.nodes.showCommentButton.addEventListener('click', codex.callback.showCommentButtonClicked, false ); - - /** * @deprecated ( but now in use for syncronization ); * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index a2750699..89ff1c9e 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap e666ce2c4dbe7a643fb7?a9b2","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e666ce2c4dbe7a643fb7","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 992983c8d5f440faae7c?5247","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 992983c8d5f440faae7c","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file