{"version":3,"sources":["webpack:///./node_modules/wangeditor/release/wangEditor.js"],"names":["global","factory","module","exports","this","polyfill","Object","assign","target","varArgs","TypeError","to","index","arguments","length","nextSource","nextKey","prototype","hasOwnProperty","call","Element","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","s","document","ownerDocument","querySelectorAll","i","item","createElemByHTML","html","div","createElement","innerHTML","children","isDOMList","selector","HTMLCollection","NodeList","result","eventList","DomElement","nodeType","selectorResult","Array","replace","trim","indexOf","$","constructor","forEach","fn","elem","clone","deep","cloneList","push","cloneNode","get","first","last","on","type","types","split","addEventListener","e","off","removeEventListener","attr","key","val","getAttribute","setAttribute","addClass","className","arr","filter","join","removeClass","css","currentStyle","style","styleArr","resultArr","map","show","hide","childNodes","append","$children","child","appendChild","remove","parent","parentElement","removeChild","isContain","$child","contains","getSizeData","getBoundingClientRect","getNodeName","nodeName","find","text","value","focus","parentUntil","_currentElem","results","equal","$elem","insertBefore","$referenceNode","referenceNode","parentNode","insertAfter","lastChild","nextSibling","offAll","config","menus","fontNames","colors","emotions","title","content","alt","src","zIndex","debug","linkCheck","link","linkImgCheck","pasteFilterStyle","pasteIgnoreImg","pasteTextHandle","showLinkImg","linkImgCallback","url","uploadImgMaxSize","uploadImgShowBase64","uploadFileName","uploadImgParams","uploadImgHeaders","withCredentials","uploadImgTimeout","uploadImgHooks","before","xhr","editor","files","success","fail","error","timeout","qiniu","UA","_ua","navigator","userAgent","isWebkit","reg","test","isIE","window","objForEach","obj","arrForEach","fakeArr","getRandom","prefix","Math","random","toString","slice","replaceHtmlSymbol","isFunction","Bold","_active","onClick","isSeleEmpty","selection","isSelectionEmpty","createEmptyRange","cmd","do","collapseRange","restoreSelection","tryChangeActive","queryCommandState","replaceLang","str","langArgs","_emptyFn","DropList","menu","opt","_this","$container","$title","titleHtml","list","$list","elemHtml","$li","hideTimeoutId","setTimeout","_rendered","_show","Head","droplist","width","_command","FontSize","FontName","fontName","clearTimeout","$menuELem","menuHeight","height","showTimeoutId","$selectionElem","getSelectionContainerElem","$textElem","cmdValue","queryCommandValue","emptyFn","_isCreatedPanelMenus","Panel","Link","Italic","Redo","StrikeThrough","Underline","Undo","List","Justify","ForeColor","color","BackColor","Quote","Code","Emoticon","Table","Video","Image","imgMenuId","$body","$textContainerElem","$closeBtn","$tabTitleContainer","$tabContentContainer","tabs","tabTitleArr","tabContentArr","tab","tabIndex","tpl","$content","_index","stopPropagation","events","event","needToHide","$inputs","_hideOtherPanels","panel","$linkelem","createRangeByElem","_createPanel","getSelectionText","inputLinkId","inputTextId","btnOkId","btnDelId","delBtnDisplay","$link","$text","_insertLink","_delLink","$selectionELem","selectionText","checkResult","alert","$parent","$targetELem","$startElem","getSelectionStartElem","$endElem","getSelectionEndElem","$code","textId","btnId","_insertCode","_updateCode","$parentElem","tabConfig","emotData","emotType","faceHtml","$target","insertHtml","_insert","emotHtml","_createEditPanel","_createInsertPanel","btnInsertId","textRowNum","textColNum","rowNum","parseInt","colNum","r","c","_this2","addRowBtnId","addColBtnId","delRowBtnId","delColBtnId","delTableBtnId","_addRow","_addCol","_delRow","_delCol","_delTable","_getLocationData","$tr","$tds","tdLength","td","$tbody","$trs","trLength","tr","locationData","trData","$currentTr","tdData","newTr","tdIndex","$trParent","$currentTd","name","toLowerCase","newTd","$table","textValId","width30","width50","width100","delBtn","tabsConfig","$img","_selectedImg","uploadImg","upTriggerId","upFileId","linkUrlId","linkBtnId","$file","fileElem","click","fileList","$linkUrl","insertLinkImg","tabsConfigResult","uploadImgServer","customUploadImg","FileReader","MenuConstructors","Menus","getPasteText","clipboardData","originalEvent","pasteText","getData","getPasteHtml","filterStyle","ignoreImg","pasteHtml","docSplitHtml","getPasteImgs","txt","items","getAsFile","getChildrenJSON","curElem","elemResult","textContent","tag","attrData","attrList","attributes","attrListLength","attrs","Text","Command","API","_currentRange","Progress","_time","_isShow","_isRender","_timeoutId","$textContainer","$bar","bold","head","fontSize","italic","redo","strikeThrough","underline","undo","justify","foreColor","backColor","quote","code","emoticon","table","video","image","init","configMenus","menuKey","MenuConstructor","_addToToolbar","_bindEvent","$toolbarElem","getRange","changeActive","clear","initSelection","getJSON","_saveRangeRealTime","_enterKeyHandle","_clearHandle","_pasteHandle","_tabHandle","_imgHandle","_dragHandle","saveRange","insertEmptyP","$p","pHandle","codeHandle","selectionNodeName","parentNodeName","queryCommandSupported","_willBreakCode","preventDefault","_startOffset","startOffset","codeLength","keyCode","txtHtml","pasteTime","canDo","now","Date","flag","resetTime","ex","pasteFiles","img","$document","dataTransfer","_useStyleWithCSS","execCommand","_name","_execCommand","change","_insertHTML","range","insertNode","deleteContents","pasteHTML","_insertElem","_range","getSelection","rangeCount","getRangeAt","$containerElem","toStart","collapse","commonAncestorContainer","startContainer","endContainer","endOffset","removeAllRanges","addRange","setEnd","isContent","createRange","selectNodeContents","selectNode","progress","timeoutId","_hide","_typeof","Symbol","iterator","UploadImg","_alert","alertInfo","debugInfo","customAlert","Error","onload","callback","onerror","onabort","_this3","maxSize","maxSizeM","maxLength","uploadImgMaxLength","uploadImgParamsWithUrl","hooks","resultFiles","errInfo","file","size","bind","formdata","FormData","uploadImgServerArr","uploadImgServerHash","XMLHttpRequest","open","ontimeout","upload","onprogress","percent","progressBar","lengthComputable","loaded","total","onreadystatechange","readyState","status","responseText","JSON","parse","customInsert","errno","data","beforeResult","prevent","msg","setRequestHeader","send","reader","readAsDataURL","editorId","Editor","toolbarSelector","textSelector","id","customConfig","_initConfig","langConfig","lang","RegExp","_initDom","$toolbarSelector","config$$1","toolbarElemId","textElemId","compositionEnd","onfocus","onblur","isFocus","isChild","isToolbar","isMenu","_initCommand","_initSelectionAPI","_initUploadImg","_initMenus","_initText","newLine","$last","onChangeTimeoutId","beforeChangeHtml","onchangeTimeout","onchange","currentHtml","create","_offAllEvent","inlinecss","getElementsByTagName","wangEditor"],"mappings":"sGAAA,SAAAA,EAAAC,GAC6DC,EAAAC,QAAAF,KAD7D,CAICG,EAAA,WAAqB,aAMtB,IAAAC,EAAA,WAGA,mBAAAC,OAAAC,SACAD,OAAAC,OAAA,SAAAC,EAAAC,GAEA,SAAAD,EAEA,UAAAE,UAAA,8CAKA,IAFA,IAAAC,EAAAL,OAAAE,GAEAI,EAAA,EAA+BA,EAAAC,UAAAC,OAA0BF,IAAA,CACzD,IAAAG,EAAAF,UAAAD,GAEA,SAAAG,EAEA,QAAAC,KAAAD,EAEAT,OAAAW,UAAAC,eAAAC,KAAAJ,EAAAC,KACAL,EAAAK,GAAAD,EAAAC,IAKA,OAAAL,IAKAS,QAAAH,UAAAI,UACAD,QAAAH,UAAAI,QAAAD,QAAAH,UAAAK,iBAAAF,QAAAH,UAAAM,oBAAAH,QAAAH,UAAAO,mBAAAJ,QAAAH,UAAAQ,kBAAAL,QAAAH,UAAAS,uBAAA,SAAAC,GACA,IAAAN,GAAAjB,KAAAwB,UAAAxB,KAAAyB,eAAAC,iBAAAH,GACAI,EAAAV,EAAAP,OACA,QAAAiB,GAAA,GAAAV,EAAAW,KAAAD,KAAA3B,MACA,OAAA2B,GAAA,KAUA,SAAAE,EAAAC,GACA,IAAAC,OAAA,EAGA,OAFAA,EAAAP,SAAAQ,cAAA,OACAD,EAAAE,UAAAH,EACAC,EAAAG,SAIA,SAAAC,EAAAC,GACA,QAAAA,IAGAA,aAAAC,gBAAAD,aAAAE,UAOA,SAAAZ,EAAAU,GACA,IAAAG,EAAAf,SAAAE,iBAAAU,GACA,OAAAD,EAAAI,GACAA,EAEA,CAAAA,GAKA,IAAAC,EAAA,GAGA,SAAAC,EAAAL,GACA,GAAAA,EAAA,CAKA,GAAAA,aAAAK,EACA,OAAAL,EAGApC,KAAAoC,WACA,IAAAM,EAAAN,EAAAM,SAGAC,EAAA,GACA,IAAAD,EAEAC,EAAA,CAAAP,GACK,IAAAM,EAELC,EAAA,CAAAP,GACKD,EAAAC,iBAAAQ,MAELD,EAAAP,EACK,kBAAAA,IAELA,IAAAS,QAAA,aAAAC,OAGAH,EAFA,IAAAP,EAAAW,QAAA,KAEAlB,EAAAO,GAGAV,EAAAU,IAIA,IAAA1B,EAAAiC,EAAAjC,OACA,IAAAA,EAEA,OAAAV,KAIA,IAAA2B,OAAA,EACA,IAAAA,EAAA,EAAeA,EAAAjB,EAAYiB,IAC3B3B,KAAA2B,GAAAgB,EAAAhB,GAEA3B,KAAAU,UAuYA,SAAAsC,EAAAZ,GACA,WAAAK,EAAAL,GApYAK,EAAA5B,UAAA,CACAoC,YAAAR,EAGAS,QAAA,SAAAC,GACA,IAAAxB,OAAA,EACA,IAAAA,EAAA,EAAmBA,EAAA3B,KAAAU,OAAiBiB,IAAA,CACpC,IAAAyB,EAAApD,KAAA2B,GACAY,EAAAY,EAAApC,KAAAqC,IAAAzB,GACA,QAAAY,EACA,MAGA,OAAAvC,MAIAqD,MAAA,SAAAC,GACA,IAAAC,EAAA,GAIA,OAHAvD,KAAAkD,QAAA,SAAAE,GACAG,EAAAC,KAAAJ,EAAAK,YAAAH,MAEAN,EAAAO,IAIAG,IAAA,SAAAlD,GACA,IAAAE,EAAAV,KAAAU,OAIA,OAHAF,GAAAE,IACAF,GAAAE,GAEAsC,EAAAhD,KAAAQ,KAIAmD,MAAA,WACA,OAAA3D,KAAA0D,IAAA,IAIAE,KAAA,WACA,IAAAlD,EAAAV,KAAAU,OACA,OAAAV,KAAA0D,IAAAhD,EAAA,IAIAmD,GAAA,SAAAC,EAAA1B,EAAAe,GAEAA,IACAA,EAAAf,EACAA,EAAA,MAIA,IAAA2B,EAAA,GAGA,OAFAA,EAAAD,EAAAE,MAAA,OAEAhE,KAAAkD,QAAA,SAAAE,GACAW,EAAAb,QAAA,SAAAY,GACAA,IAKAtB,EAAAgB,KAAA,CACAJ,OACAU,OACAX,OAGAf,EAOAgB,EAAAa,iBAAAH,EAAA,SAAAI,GACA,IAAA9D,EAAA8D,EAAA9D,OACAA,EAAAa,QAAAmB,IACAe,EAAApC,KAAAX,EAAA8D,KARAd,EAAAa,iBAAAH,EAAAX,SAgBAgB,IAAA,SAAAL,EAAAX,GACA,OAAAnD,KAAAkD,QAAA,SAAAE,GACAA,EAAAgB,oBAAAN,EAAAX,MAKAkB,KAAA,SAAAC,EAAAC,GACA,aAAAA,EAEAvE,KAAA,GAAAwE,aAAAF,GAGAtE,KAAAkD,QAAA,SAAAE,GACAA,EAAAqB,aAAAH,EAAAC,MAMAG,SAAA,SAAAC,GACA,OAAAA,EAGA3E,KAAAkD,QAAA,SAAAE,GACA,IAAAwB,OAAA,EACAxB,EAAAuB,WAEAC,EAAAxB,EAAAuB,UAAAX,MAAA,MACAY,IAAAC,OAAA,SAAAjD,GACA,QAAAA,EAAAkB,SAGA8B,EAAA7B,QAAA4B,GAAA,GACAC,EAAApB,KAAAmB,GAGAvB,EAAAuB,UAAAC,EAAAE,KAAA,MAEA1B,EAAAuB,cAjBA3E,MAuBA+E,YAAA,SAAAJ,GACA,OAAAA,EAGA3E,KAAAkD,QAAA,SAAAE,GACA,IAAAwB,OAAA,EACAxB,EAAAuB,YAEAC,EAAAxB,EAAAuB,UAAAX,MAAA,MACAY,IAAAC,OAAA,SAAAjD,GAGA,OAFAA,IAAAkB,UAEAlB,OAAA+C,KAMAvB,EAAAuB,UAAAC,EAAAE,KAAA,QAhBA9E,MAsBAgF,IAAA,SAAAV,EAAAC,GACA,IAAAU,EAAAX,EAAA,IAAAC,EAAA,IACA,OAAAvE,KAAAkD,QAAA,SAAAE,GACA,IAAA8B,GAAA9B,EAAAoB,aAAA,cAAA1B,OACAqC,OAAA,EACAC,EAAA,GACAF,GAEAC,EAAAD,EAAAlB,MAAA,KACAmB,EAAAjC,QAAA,SAAAtB,GAEA,IAAAgD,EAAAhD,EAAAoC,MAAA,KAAAqB,IAAA,SAAA1D,GACA,OAAAA,EAAAmB,SAEA,IAAA8B,EAAAlE,QACA0E,EAAA5B,KAAAoB,EAAA,OAAAA,EAAA,MAIAQ,IAAAC,IAAA,SAAAzD,GACA,WAAAA,EAAAmB,QAAAuB,GACAW,EAEArD,IAGAwD,EAAArC,QAAAkC,GAAA,GACAG,EAAA5B,KAAAyB,GAGA7B,EAAAqB,aAAA,QAAAW,EAAAN,KAAA,QAGA1B,EAAAqB,aAAA,QAAAQ,MAMAK,KAAA,WACA,OAAAtF,KAAAgF,IAAA,oBAIAO,KAAA,WACA,OAAAvF,KAAAgF,IAAA,mBAIA9C,SAAA,WACA,IAAAkB,EAAApD,KAAA,GACA,OAAAoD,EAIAJ,EAAAI,EAAAlB,UAHA,MAOAsD,WAAA,WACA,IAAApC,EAAApD,KAAA,GACA,OAAAoD,EAIAJ,EAAAI,EAAAoC,YAHA,MAOAC,OAAA,SAAAC,GACA,OAAA1F,KAAAkD,QAAA,SAAAE,GACAsC,EAAAxC,QAAA,SAAAyC,GACAvC,EAAAwC,YAAAD,QAMAE,OAAA,WACA,OAAA7F,KAAAkD,QAAA,SAAAE,GACA,GAAAA,EAAAyC,OACAzC,EAAAyC,aACa,CACb,IAAAC,EAAA1C,EAAA2C,cACAD,KAAAE,YAAA5C,OAMA6C,UAAA,SAAAC,GACA,IAAA9C,EAAApD,KAAA,GACA2F,EAAAO,EAAA,GACA,OAAA9C,EAAA+C,SAAAR,IAIAS,YAAA,WACA,IAAAhD,EAAApD,KAAA,GACA,OAAAoD,EAAAiD,yBAIAC,YAAA,WACA,IAAAlD,EAAApD,KAAA,GACA,OAAAoD,EAAAmD,UAIAC,KAAA,SAAApE,GACA,IAAAgB,EAAApD,KAAA,GACA,OAAAgD,EAAAI,EAAA1B,iBAAAU,KAIAqE,KAAA,SAAAlC,GACA,GAAAA,EAQA,OAAAvE,KAAAkD,QAAA,SAAAE,GACAA,EAAAnB,UAAAsC,IAPA,IAAAnB,EAAApD,KAAA,GACA,OAAAoD,EAAAnB,UAAAY,QAAA,oBACA,YAWAf,KAAA,SAAA4E,GACA,IAAAtD,EAAApD,KAAA,GACA,aAAA0G,EACAtD,EAAAnB,WAEAmB,EAAAnB,UAAAyE,EACA1G,OAKAuE,IAAA,WACA,IAAAnB,EAAApD,KAAA,GACA,OAAAoD,EAAAsD,MAAA5D,QAIA6D,MAAA,WACA,OAAA3G,KAAAkD,QAAA,SAAAE,GACAA,EAAAuD,WAKAb,OAAA,WACA,IAAA1C,EAAApD,KAAA,GACA,OAAAgD,EAAAI,EAAA2C,gBAIAa,YAAA,SAAAxE,EAAAyE,GACA,IAAAC,EAAAtF,SAAAE,iBAAAU,GACA1B,EAAAoG,EAAApG,OACA,IAAAA,EAEA,YAGA,IAAA0C,EAAAyD,GAAA7G,KAAA,GACA,YAAAoD,EAAAmD,SACA,YAGA,IAAAT,EAAA1C,EAAA2C,cACApE,OAAA,EACA,IAAAA,EAAA,EAAmBA,EAAAjB,EAAYiB,IAC/B,GAAAmE,IAAAgB,EAAAnF,GAEA,OAAAqB,EAAA8C,GAKA,OAAA9F,KAAA4G,YAAAxE,EAAA0D,IAIAiB,MAAA,SAAAC,GACA,WAAAA,EAAAtE,SACA1C,KAAA,KAAAgH,EAEAhH,KAAA,KAAAgH,EAAA,IAKAC,aAAA,SAAA7E,GACA,IAAA8E,EAAAlE,EAAAZ,GACA+E,EAAAD,EAAA,GACA,OAAAC,EAGAnH,KAAAkD,QAAA,SAAAE,GACA,IAAA0C,EAAAqB,EAAAC,WACAtB,EAAAmB,aAAA7D,EAAA+D,KAJAnH,MASAqH,YAAA,SAAAjF,GACA,IAAA8E,EAAAlE,EAAAZ,GACA+E,EAAAD,EAAA,GACA,OAAAC,EAGAnH,KAAAkD,QAAA,SAAAE,GACA,IAAA0C,EAAAqB,EAAAC,WACAtB,EAAAwB,YAAAH,EAEArB,EAAAF,YAAAxC,GAGA0C,EAAAmB,aAAA7D,EAAA+D,EAAAI,eATAvH,OAqBAgD,EAAAwE,OAAA,WACAhF,EAAAU,QAAA,SAAAtB,GACA,IAAAwB,EAAAxB,EAAAwB,KACAU,EAAAlC,EAAAkC,KACAX,EAAAvB,EAAAuB,GAEAC,EAAAgB,oBAAAN,EAAAX,MAQA,IAAAsE,EAAA,CAGAC,MAAA,2LAEAC,UAAA,yCAEAC,OAAA,sGAaAC,SAAA,EAEAC,MAAA,KAEAhE,KAAA,QAEAiE,QAAA,EACAC,IAAA,OACAC,IAAA,wFACS,CACTD,IAAA,OACAC,IAAA,oFACS,CACTD,IAAA,MACAC,IAAA,oFAEK,CAELH,MAAA,KAEAhE,KAAA,QAEAiE,QAAA,EACAE,IAAA,uFACAD,IAAA,SACS,CACTC,IAAA,qFACAD,IAAA,QACS,CACTC,IAAA,oFACAD,IAAA,UAEK,CAELF,MAAA,QAEAhE,KAAA,QAEAiE,QAAA,2DAAA/D,MAAA,QAIAkE,OAAA,IAGAC,OAAA,EAGAC,UAAA,SAAA3B,EAAA4B,GAGA,UAKAC,aAAA,SAAAL,GAEA,UAKAM,kBAAA,EAGAC,gBAAA,EAIAC,gBAAA,SAAAV,GAEA,OAAAA,GAUAW,aAAA,EAGAC,gBAAA,SAAAC,KAKAC,iBAAA,QAMAC,qBAAA,EAMAC,eAAA,GAGAC,gBAAA,GAKAC,iBAAA,GAKAC,iBAAA,EAGAC,iBAAA,IAGAC,eAAA,CASAC,OAAA,SAAAC,EAAAC,EAAAC,KASAC,QAAA,SAAAH,EAAAC,EAAAhH,KAGAmH,KAAA,SAAAJ,EAAAC,EAAAhH,KAGAoH,MAAA,SAAAL,EAAAC,KAGAK,QAAA,SAAAN,EAAAC,MAMAM,OAAA,GASAC,EAAA,CACAC,IAAAC,UAAAC,UAGAC,SAAA,WACA,IAAAC,EAAA,UACA,OAAAA,EAAAC,KAAApK,KAAA+J,MAIAM,KAAA,WACA,wBAAAC,SAKA,SAAAC,EAAAC,EAAArH,GACA,IAAAmB,OAAA,EACA/B,OAAA,EACA,IAAA+B,KAAAkG,EACA,GAAAA,EAAA1J,eAAAwD,KACA/B,EAAAY,EAAApC,KAAAyJ,EAAAlG,EAAAkG,EAAAlG,KACA,IAAA/B,GACA,MAOA,SAAAkI,EAAAC,EAAAvH,GACA,IAAAxB,OAAA,EACAC,OAAA,EACAW,OAAA,EACA7B,EAAAgK,EAAAhK,QAAA,EACA,IAAAiB,EAAA,EAAeA,EAAAjB,EAAYiB,IAG3B,GAFAC,EAAA8I,EAAA/I,GACAY,EAAAY,EAAApC,KAAA2J,EAAA9I,EAAAD,IACA,IAAAY,EACA,MAMA,SAAAoI,EAAAC,GACA,OAAAA,EAAAC,KAAAC,SAAAC,WAAAC,MAAA,GAIA,SAAAC,EAAAnJ,GACA,aAAAA,EACA,GAEAA,EAAAe,QAAA,cAAoCA,QAAA,cAAuBA,QAAA,gBAAyBA,QAAA,yBAOpF,SAAAqI,EAAA/H,GACA,0BAAAA,EAOA,SAAAgI,EAAA5B,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,qFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAIAD,EAAAtK,UAAA,CACAoC,YAAAkI,EAGAE,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OACA+B,EAAA/B,EAAAgC,UAAAC,mBAEAF,GAEA/B,EAAAgC,UAAAE,mBAIAlC,EAAAmC,IAAAC,GAAA,QAEAL,IAEA/B,EAAAgC,UAAAK,gBACArC,EAAAgC,UAAAM,qBAKAC,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAAmC,IAAAK,kBAAA,SACA/L,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBASA,IAAAiH,EAAA,SAAAzC,EAAA0C,GACA,IAAAC,EAAA3C,EAAA9B,OAAAyE,UAAA,GACA3J,EAAA0J,EAaA,OAXAC,EAAAhJ,QAAA,SAAAtB,GACA,IAAAuI,EAAAvI,EAAAuI,IACA5F,EAAA3C,EAAA2C,IAEA4F,EAAAC,KAAA7H,KACAA,IAAAM,QAAAsH,EAAA,WACA,OAAA5F,OAKAhC,GAMA4J,EAAA,aAGA,SAAAC,EAAAC,EAAAC,GACA,IAAAC,EAAAvM,KAGAuJ,EAAA8C,EAAA9C,OACAvJ,KAAAqM,OACArM,KAAAsM,MAEA,IAAAE,EAAAxJ,EAAA,oCAGAyJ,EAAAH,EAAAG,OACAC,OAAA,EACAD,IAEAC,EAAAD,EAAA3K,OACA4K,EAAAV,EAAAzC,EAAAmD,GACAD,EAAA3K,KAAA4K,GAEAD,EAAA/H,SAAA,gBACA8H,EAAA/G,OAAAgH,IAGA,IAAAE,EAAAL,EAAAK,MAAA,GACA7I,EAAAwI,EAAAxI,MAAA,OACAuH,EAAAiB,EAAAjB,SAAAc,EAGAS,EAAA5J,EAAA,wBAAAc,EAAA,mCACA0I,EAAA/G,OAAAmH,GACAD,EAAAzJ,QAAA,SAAAtB,GACA,IAAAoF,EAAApF,EAAAoF,MAGA6F,EAAA7F,EAAAlF,OACA+K,EAAAb,EAAAzC,EAAAsD,GACA7F,EAAAlF,KAAA+K,GAEA,IAAAnG,EAAA9E,EAAA8E,MACAoG,EAAA9J,EAAA,8BACAgE,IACA8F,EAAArH,OAAAuB,GACA4F,EAAAnH,OAAAqH,GACAA,EAAAjJ,GAAA,iBAAAK,GACAmH,EAAA3E,GAGA6F,EAAAQ,cAAAC,WAAA,WACAT,EAAAhH,QACiB,QAMjBiH,EAAA3I,GAAA,sBAAAK,GACAqI,EAAAQ,cAAAC,WAAA,WACAT,EAAAhH,QACS,KAITvF,KAAAwM,aAGAxM,KAAAiN,WAAA,EACAjN,KAAAkN,OAAA,EA2DA,SAAAC,EAAA5D,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,+DACAhD,KAAA8D,KAAA,WAGA9D,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,eACAc,KAAA,OACA6I,KAAA,EAAgB3F,MAAAhE,EAAA,eAAA0D,MAAA,QAAyC,CAAGM,MAAAhE,EAAA,eAAA0D,MAAA,QAAyC,CAAGM,MAAAhE,EAAA,eAAA0D,MAAA,QAAyC,CAAGM,MAAAhE,EAAA,eAAA0D,MAAA,QAAyC,CAAGM,MAAAhE,EAAA,eAAA0D,MAAA,QAAyC,CAAGM,MAAAhE,EAAA,aAAA0D,MAAA,QAC5O2E,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MA4CA,SAAA6G,EAAAhE,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,mEACAhD,KAAA8D,KAAA,WAGA9D,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,aACAc,KAAA,OACA6I,KAAA,EAAgB3F,MAAAhE,EAAA,oDAA2C0D,MAAA,KAAgC,CAAGM,MAAAhE,EAAA,gDAAyC0D,MAAA,KAA8B,CAAGM,MAAAhE,EAAA,uBAAA0D,MAAA,KAA8C,CAAGM,MAAAhE,EAAA,gDAAyC0D,MAAA,KAA8B,CAAGM,MAAAhE,EAAA,oDAA2C0D,MAAA,KAAgC,CAAGM,MAAAhE,EAAA,sDAA4C0D,MAAA,MAC7Z2E,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MAqBA,SAAA8G,EAAAjE,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,6DACAhD,KAAA8D,KAAA,WAGA9D,KAAAoL,SAAA,EAGA,IAAA3D,EAAA8B,EAAA9B,OACAE,EAAAF,EAAAE,WAAA,GAGA3H,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,aACAc,KAAA,OACA6I,KAAAhF,EAAAtC,IAAA,SAAAoI,GACA,OAAoBzG,MAAAhE,EAAA,6BAAAyK,EAAA,MAAsDA,EAAA,WAAA/G,MAAA+G,KAE1EpC,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MApLA0F,EAAAvL,UAAA,CACAoC,YAAAmJ,EAGA9G,KAAA,WACAtF,KAAA+M,eAEAW,aAAA1N,KAAA+M,eAGA,IAAAV,EAAArM,KAAAqM,KACAsB,EAAAtB,EAAArF,MACAwF,EAAAxM,KAAAwM,WACA,IAAAxM,KAAAkN,MAAA,CAGA,GAAAlN,KAAAiN,UAEAT,EAAAlH,WACS,CAET,IAAAsI,EAAAD,EAAAvH,cAAAyH,QAAA,EACAR,EAAArN,KAAAsM,IAAAe,OAAA,IACAb,EAAAxH,IAAA,aAAA4I,EAAA,MAAA5I,IAAA,QAAAqI,EAAA,MAGAM,EAAAlI,OAAA+G,GACAxM,KAAAiN,WAAA,EAIAjN,KAAAkN,OAAA,IAIA3H,KAAA,WACAvF,KAAA8N,eAEAJ,aAAA1N,KAAA8N,eAGA,IAAAtB,EAAAxM,KAAAwM,WACAxM,KAAAkN,QAIAV,EAAAjH,OACAvF,KAAAkN,OAAA,KAgCAC,EAAAtM,UAAA,CACAoC,YAAAkK,EAGAG,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OAEAwE,EAAAxE,EAAAgC,UAAAyC,4BACAzE,EAAA0E,UAAAlH,MAAAgH,IAMAxE,EAAAmC,IAAAC,GAAA,cAAAjF,IAIAoF,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAmD,EAAA,MACA+D,EAAA3E,EAAAmC,IAAAyC,kBAAA,eACAhE,EAAAC,KAAA8D,IACAlO,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAkCAwI,EAAA1M,UAAA,CACAoC,YAAAsK,EAGAD,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,WAAAjF,KAuCA8G,EAAA3M,UAAA,CACAoC,YAAAuK,EAEAF,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,WAAAjF,KAQA,IAAA0H,EAAA,aAGAC,EAAA,GAGA,SAAAC,EAAAjC,EAAAC,GACAtM,KAAAqM,OACArM,KAAAsM,MAyLA,SAAAiC,EAAAhF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,6DACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAsJA,SAAAoD,EAAAjF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,uFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EA+CA,SAAAqD,EAAAlF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,qFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAsBA,SAAAsD,EAAAnF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,8FACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EA+CA,SAAAuD,EAAApF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,0FACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EA+CA,SAAAwD,EAAArF,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,qFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAsBA,SAAAyD,EAAAtF,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,8DACAhD,KAAA8D,KAAA,WAGA9D,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,eACAc,KAAA,OACA6I,KAAA,EAAgB3F,MAAAhE,EAAA,4DAAA0D,MAAA,qBAAmG,CAAGM,MAAAhE,EAAA,oDAAA0D,MAAA,wBACtH2E,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MA2DA,SAAAoI,EAAAvF,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,uEACAhD,KAAA8D,KAAA,WAGA9D,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,eACAc,KAAA,OACA6I,KAAA,EAAgB3F,MAAAhE,EAAA,2DAAA0D,MAAA,eAA4F,CAAGM,MAAAhE,EAAA,6DAAA0D,MAAA,iBAAgG,CAAGM,MAAAhE,EAAA,4DAAA0D,MAAA,iBAClN2E,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MAoBA,SAAAqI,EAAAxF,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,gEACAhD,KAAA8D,KAAA,WAGA,IAAA2D,EAAA8B,EAAA9B,OACAG,EAAAH,EAAAG,QAAA,GAGA5H,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,eACAc,KAAA,eACA6I,KAAA/E,EAAAvC,IAAA,SAAA2J,GACA,OAAoBhI,MAAAhE,EAAA,mBAAAgM,EAAA,oCAAyCtI,MAAAsI,KAE7D3D,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MAoBA,SAAAuI,EAAA1F,GACA,IAAAgD,EAAAvM,KAEAA,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,oEACAhD,KAAA8D,KAAA,WAGA,IAAA2D,EAAA8B,EAAA9B,OACAG,EAAAH,EAAAG,QAAA,GAGA5H,KAAAoL,SAAA,EAGApL,KAAAoN,SAAA,IAAAhB,EAAApM,KAAA,CACAqN,MAAA,IACAZ,OAAAzJ,EAAA,cACAc,KAAA,eACA6I,KAAA/E,EAAAvC,IAAA,SAAA2J,GACA,OAAoBhI,MAAAhE,EAAA,mBAAAgM,EAAA,wCAAyCtI,MAAAsI,KAE7D3D,QAAA,SAAA3E,GAEA6F,EAAAe,SAAA5G,MAoBA,SAAAwI,EAAA3F,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,4FACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EA8DA,SAAA+D,EAAA5F,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,yFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAiIA,SAAAgE,EAAA7F,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,sFACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAqGA,SAAAiE,EAAA9F,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,+DACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAmVA,SAAAkE,EAAA/F,GACAvJ,KAAAuJ,SACAvJ,KAAAgH,MAAAhE,EAAA,6DACAhD,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAqEA,SAAAmE,EAAAhG,GACAvJ,KAAAuJ,SACA,IAAAiG,EAAA7E,EAAA,WACA3K,KAAAgH,MAAAhE,EAAA,6BAAAwM,EAAA,0CACAjG,EAAAiG,YACAxP,KAAA8D,KAAA,QAGA9D,KAAAoL,SAAA,EAr9CAkD,EAAAzN,UAAA,CACAoC,YAAAqL,EAGAhJ,KAAA,WACA,IAAAiH,EAAAvM,KAEAqM,EAAArM,KAAAqM,KACA,KAAAgC,EAAAtL,QAAAsJ,IAAA,IAKA,IAAA9C,EAAA8C,EAAA9C,OACAkG,EAAAzM,EAAA,QACA0M,EAAAnG,EAAAmG,mBACApD,EAAAtM,KAAAsM,IAGAE,EAAAxJ,EAAA,2CACAqK,EAAAf,EAAAe,OAAA,IACAb,EAAAxH,IAAA,QAAAqI,EAAA,MAAArI,IAAA,iBAAAqI,GAAA,QAGA,IAAAsC,EAAA3M,EAAA,kDACAwJ,EAAA/G,OAAAkK,GACAA,EAAA9L,GAAA,mBACA0I,EAAAhH,SAIA,IAAAqK,EAAA5M,EAAA,yCACA6M,EAAA7M,EAAA,6CACAwJ,EAAA/G,OAAAmK,GAAAnK,OAAAoK,GAGA,IAAAhC,EAAAvB,EAAAuB,OACAA,GACAgC,EAAA7K,IAAA,SAAA6I,EAAA,MAAA7I,IAAA,qBAIA,IAAA8K,EAAAxD,EAAAwD,MAAA,GACAC,EAAA,GACAC,EAAA,GACAF,EAAA5M,QAAA,SAAA+M,EAAAC,GACA,GAAAD,EAAA,CAGA,IAAAnI,EAAAmI,EAAAnI,OAAA,GACAqI,EAAAF,EAAAE,KAAA,GAGArI,EAAAkE,EAAAzC,EAAAzB,GACAqI,EAAAnE,EAAAzC,EAAA4G,GAGA,IAAA1D,EAAAzJ,EAAA,wBAAA8E,EAAA,SACA8H,EAAAnK,OAAAgH,GACA,IAAA2D,EAAApN,EAAAmN,GACAN,EAAApK,OAAA2K,GAGA3D,EAAA4D,OAAAH,EACAH,EAAAvM,KAAAiJ,GACAuD,EAAAxM,KAAA4M,GAGA,IAAAF,GACAzD,EAAArB,SAAA,EACAqB,EAAA/H,SAAA,eAEA0L,EAAA7K,OAIAkH,EAAA5I,GAAA,iBAAAK,GACAuI,EAAArB,UAIA2E,EAAA7M,QAAA,SAAAuJ,GACAA,EAAArB,SAAA,EACAqB,EAAA1H,YAAA,gBAEAiL,EAAA9M,QAAA,SAAAkN,GACAA,EAAA7K,SAIAkH,EAAArB,SAAA,EACAqB,EAAA/H,SAAA,cACA0L,EAAA9K,aAKAkH,EAAA3I,GAAA,iBAAAK,GAEAA,EAAAoM,oBAEAb,EAAA5L,GAAA,iBAAAK,GACAqI,EAAAhH,SAIAmK,EAAAjK,OAAA+G,GAGAsD,EAAA5M,QAAA,SAAA+M,EAAAzP,GACA,GAAAyP,EAAA,CAGA,IAAAM,EAAAN,EAAAM,QAAA,GACAA,EAAArN,QAAA,SAAAsN,GACA,IAAApO,EAAAoO,EAAApO,SACA0B,EAAA0M,EAAA1M,KACAX,EAAAqN,EAAArN,IAAAiL,EACAgC,EAAAJ,EAAAxP,GACA4P,EAAA5J,KAAApE,GAAAyB,GAAAC,EAAA,SAAAI,GACAA,EAAAoM,kBACA,IAAAG,EAAAtN,EAAAe,GAEAuM,GACAlE,EAAAhH,cAOA,IAAAmL,EAAAlE,EAAAhG,KAAA,6BACAkK,EAAAhQ,QACAgQ,EAAAhN,IAAA,GAAAiD,QAIA3G,KAAAwM,aAGAxM,KAAA2Q,mBAEAtC,EAAA7K,KAAA6I,KAIA9G,KAAA,WACA,IAAA8G,EAAArM,KAAAqM,KACAG,EAAAxM,KAAAwM,WACAA,GACAA,EAAA3G,SAIAwI,IAAAxJ,OAAA,SAAAjD,GACA,OAAAA,IAAAyK,KASAsE,iBAAA,WACAtC,EAAA3N,QAGA2N,EAAAnL,QAAA,SAAAmJ,GACA,IAAAuE,EAAAvE,EAAAuE,OAAA,GACAA,EAAArL,MACAqL,EAAArL,WAoBAgJ,EAAA1N,UAAA,CACAoC,YAAAsL,EAGAlD,QAAA,SAAAnH,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAsH,OAAA,EAEA,GAAA7Q,KAAAoL,QAAA,CAGA,GADAyF,EAAAtH,EAAAgC,UAAAyC,6BACA6C,EACA,OAGAtH,EAAAgC,UAAAuF,kBAAAD,GACAtH,EAAAgC,UAAAM,mBAEA7L,KAAA+Q,aAAAF,EAAApK,OAAAoK,EAAAxM,KAAA,cAGAkF,EAAAgC,UAAAC,mBAEAxL,KAAA+Q,aAAA,OAGA/Q,KAAA+Q,aAAAxH,EAAAgC,UAAAyF,mBAAA,KAMAD,aAAA,SAAAtK,EAAA4B,GACA,IAAAkE,EAAAvM,KAGAiR,EAAAtG,EAAA,cACAuG,EAAAvG,EAAA,cACAwG,EAAAxG,EAAA,UACAyG,EAAAzG,EAAA,WAGA0G,EAAArR,KAAAoL,QAAA,sBAGAwF,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IAEAyC,KAAA,EAEAhI,MAAA,KAEAqI,IAAA,iDAAAe,EAAA,sCAAAzK,EAAA,uEAAAwK,EAAA,sCAAA5I,EAAA,kJAAA8I,EAAA,4EAAAC,EAAA,uCAAAC,EAAA,sFAEAd,OAAA,CAEA,CACAnO,SAAA,IAAA+O,EACArN,KAAA,QACAX,GAAA,WAEA,IAAAmO,EAAAtO,EAAA,IAAAiO,GACAM,EAAAvO,EAAA,IAAAkO,GACA7I,EAAAiJ,EAAA/M,MACAkC,EAAA8K,EAAAhN,MAIA,OAHAgI,EAAAiF,YAAA/K,EAAA4B,IAGA,IAIA,CACAjG,SAAA,IAAAgP,EACAtN,KAAA,QACAX,GAAA,WAKA,OAHAoJ,EAAAkF,YAGA,SAQAb,EAAAtL,OAGAtF,KAAA4Q,SAIAa,SAAA,WACA,GAAAzR,KAAAoL,QAAA,CAGA,IAAA7B,EAAAvJ,KAAAuJ,OACAmI,EAAAnI,EAAAgC,UAAAyC,4BACA,GAAA0D,EAAA,CAGA,IAAAC,EAAApI,EAAAgC,UAAAyF,mBACAzH,EAAAmC,IAAAC,GAAA,sBAAAgG,EAAA,cAIAH,YAAA,SAAA/K,EAAA4B,GACA,IAAAkB,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OACAW,EAAAX,EAAAW,UACAwJ,GAAA,EACAxJ,GAAA,oBAAAA,IACAwJ,EAAAxJ,EAAA3B,EAAA4B,KAEA,IAAAuJ,EACArI,EAAAmC,IAAAC,GAAA,yBAAAtD,EAAA,qBAAA5B,EAAA,QAEAoL,MAAAD,IAKA9F,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACA0K,EAAAnI,EAAAgC,UAAAyC,4BACA0D,IAGA,MAAAA,EAAApL,eACAtG,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,kBAmBAyJ,EAAA3N,UAAA,CACAoC,YAAAuL,EAGAnD,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OACA+B,EAAA/B,EAAAgC,UAAAC,mBAEAF,GAEA/B,EAAAgC,UAAAE,mBAIAlC,EAAAmC,IAAAC,GAAA,UAEAL,IAEA/B,EAAAgC,UAAAK,gBACArC,EAAAgC,UAAAM,qBAKAC,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAAmC,IAAAK,kBAAA,WACA/L,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAmBA0J,EAAA5N,UAAA,CACAoC,YAAAwL,EAGApD,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OAGAA,EAAAmC,IAAAC,GAAA,UAkBA+C,EAAA7N,UAAA,CACAoC,YAAAyL,EAGArD,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OACA+B,EAAA/B,EAAAgC,UAAAC,mBAEAF,GAEA/B,EAAAgC,UAAAE,mBAIAlC,EAAAmC,IAAAC,GAAA,iBAEAL,IAEA/B,EAAAgC,UAAAK,gBACArC,EAAAgC,UAAAM,qBAKAC,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAAmC,IAAAK,kBAAA,kBACA/L,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAmBA4J,EAAA9N,UAAA,CACAoC,YAAA0L,EAGAtD,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OACA+B,EAAA/B,EAAAgC,UAAAC,mBAEAF,GAEA/B,EAAAgC,UAAAE,mBAIAlC,EAAAmC,IAAAC,GAAA,aAEAL,IAEA/B,EAAAgC,UAAAK,gBACArC,EAAAgC,UAAAM,qBAKAC,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAAmC,IAAAK,kBAAA,cACA/L,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAmBA6J,EAAA/N,UAAA,CACAoC,YAAA2L,EAGAvD,QAAA,SAAAnH,GAGA,IAAAqF,EAAAvJ,KAAAuJ,OAGAA,EAAAmC,IAAAC,GAAA,UAgCAkD,EAAAhO,UAAA,CACAoC,YAAA4L,EAGAvB,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAEA,GADA1E,EAAAgC,UAAAM,oBACAtC,EAAAmC,IAAAK,kBAAArF,GAAA,CAGA6C,EAAAmC,IAAAC,GAAAjF,GAGA,IAAAqH,EAAAxE,EAAAgC,UAAAyC,4BAIA,GAHA,OAAAD,EAAAzH,gBACAyH,IAAAjI,WAEA,eAAAsE,KAAA2D,EAAAzH,iBAGAyH,EAAAhH,MAAAkH,GAAA,CAIA,IAAA6D,EAAA/D,EAAAjI,SACAgM,EAAA/K,MAAAkH,KAKAF,EAAA1G,YAAAyK,GACAA,EAAAjM,aAIAiG,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAAmC,IAAAK,kBAAA,wBAAAxC,EAAAmC,IAAAK,kBAAA,sBACA/L,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAiCA+J,EAAAjO,UAAA,CACAoC,YAAA6L,EAGAxB,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAAjF,KAsCAqI,EAAAlO,UAAA,CACAoC,YAAA8L,EAGAzB,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,YAAAjF,KAsCAuI,EAAApO,UAAA,CACAoC,YAAAgM,EAGA3B,SAAA,SAAA5G,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,YAAAjF,KAkBAwI,EAAArO,UAAA,CACAoC,YAAAiM,EAEA7D,QAAA,SAAAnH,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAwE,EAAAxE,EAAAgC,UAAAyC,4BACAzH,EAAAwH,EAAAzH,cAEA,GAAAwD,EAAAO,OAAA,CAYA,IAAAtC,OAAA,EACAgK,OAAA,EACA,SAAAxL,EAMA,OAJAwB,EAAAgG,EAAAtH,OACAsL,EAAA/O,EAAA,eAAA+E,EAAA,iBACAgK,EAAA1K,YAAA0G,QACAA,EAAAlI,SAGA,eAAAU,IAEAwB,EAAAgG,EAAAtH,OACAsL,EAAA/O,EAAA,MAAA+E,EAAA,QACAgK,EAAA1K,YAAA0G,GACAA,EAAAlI,cA1BA,eAAAU,EAEAgD,EAAAmC,IAAAC,GAAA,qBAGApC,EAAAmC,IAAAC,GAAA,+BAyBAG,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAmD,EAAA,gBACA+D,EAAA3E,EAAAmC,IAAAyC,kBAAA,eACAhE,EAAAC,KAAA8D,IACAlO,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAmBAoK,EAAAtO,UAAA,CACAoC,YAAAkM,EAEA9D,QAAA,SAAAnH,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAyI,EAAAzI,EAAAgC,UAAA0G,wBACAC,EAAA3I,EAAAgC,UAAA4G,sBACA7G,EAAA/B,EAAAgC,UAAAC,mBACAmG,EAAApI,EAAAgC,UAAAyF,mBACAoB,OAAA,EAEA,GAAAJ,EAAAjL,MAAAmL,GAKA,OAAA5G,OAUAtL,KAAAoL,QAEApL,KAAA+Q,aAAAiB,EAAAlQ,QAGA9B,KAAA+Q,iBAbAqB,EAAApP,EAAA,SAAA2O,EAAA,WACApI,EAAAmC,IAAAC,GAAA,aAAAyG,GACA7I,EAAAgC,UAAAuF,kBAAAsB,GAAA,QACA7I,EAAAgC,UAAAM,oBARAtC,EAAAgC,UAAAM,oBAsBAkF,aAAA,SAAArK,GACA,IAAA6F,EAAAvM,KAGA0G,KAAA,GACA,IAAA5C,EAAA4C,EAAA,aACA2L,EAAA1H,EAAA,SACA2H,EAAA3H,EAAA,OAEAiG,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IAEAyC,KAAA,EAEAhI,MAAA,OAEAqI,IAAA,gDAAAkC,EAAA,4BAAwG3L,EAAA,oHAAA4L,EAAA,yFAExG/B,OAAA,CAEA,CACAnO,SAAA,IAAAkQ,EACAxO,KAAA,QACAX,GAAA,WACA,IAAAoO,EAAAvO,EAAA,IAAAqP,GACA5L,EAAA8K,EAAAhN,OAAAgN,EAAAzP,OAWA,OAVA2E,EAAAwE,EAAAxE,GACA,QAAA3C,EAEAyI,EAAAgG,YAAA9L,GAGA8F,EAAAiG,YAAA/L,IAIA,SAQAmK,EAAAtL,OAGAtF,KAAA4Q,SAIA2B,YAAA,SAAA7L,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,2BAAAjF,EAAA,6BAIA8L,YAAA,SAAA9L,GACA,IAAA6C,EAAAvJ,KAAAuJ,OACAmI,EAAAnI,EAAAgC,UAAAyC,4BACA0D,IAGAA,EAAA5P,KAAA4E,GACA6C,EAAAgC,UAAAM,qBAIAC,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACA0K,EAAAnI,EAAAgC,UAAAyC,4BACA,GAAA0D,EAAA,CAGA,IAAAe,EAAAf,EAAA5L,SACA,SAAA4L,EAAApL,eAAA,QAAAmM,EAAAnM,eACAtG,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,kBAmBAqK,EAAAvO,UAAA,CACAoC,YAAAmM,EAEA/D,QAAA,WACArL,KAAA+Q,gBAGAA,aAAA,WACA,IAAAxE,EAAAvM,KAEAuJ,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OAEAI,EAAAJ,EAAAI,UAAA,GAGA6K,EAAA,GACA7K,EAAA3E,QAAA,SAAAyP,GACA,IAAAC,EAAAD,EAAA7O,KACAiE,EAAA4K,EAAA5K,SAAA,GAGA8K,EAAA,GAGA,UAAAD,GACA7K,EAAA7E,QAAA,SAAAtB,GACAA,IACAiR,GAAA,0BAAAjR,EAAA,aAKA,UAAAgR,GACA7K,EAAA7E,QAAA,SAAAtB,GACA,IAAAqG,EAAArG,EAAAqG,IACAD,EAAApG,EAAAoG,IACAC,IAEA4K,GAAA,oCAAA5K,EAAA,UAAAD,EAAA,6BAKA0K,EAAAlP,KAAA,CACAsE,MAAA6K,EAAA7K,MACAqI,IAAA,uCAAA0C,EAAA,SACAtC,OAAA,EACAnO,SAAA,gBACA0B,KAAA,QACAX,GAAA,SAAAe,GACA,IAAA9D,EAAA8D,EAAA9D,OACA0S,EAAA9P,EAAA5C,GACAmG,EAAAuM,EAAAxM,cAEAyM,OAAA,EAWA,OARAA,EAFA,QAAAxM,EAEAuM,EAAAhN,SAAAhE,OAGA,SAAAgR,EAAAhR,OAAA,UAGAyK,EAAAyG,QAAAD,IAEA,SAMA,IAAAnC,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IACAQ,OAAA,IAEAiC,KAAA4C,IAIA9B,EAAAtL,OAGAtF,KAAA4Q,SAIAoC,QAAA,SAAAC,GACA,IAAA1J,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,aAAAsH,KAkBA5D,EAAAxO,UAAA,CACAoC,YAAAoM,EAEAhE,QAAA,WACArL,KAAAoL,QAEApL,KAAAkT,mBAGAlT,KAAAmT,sBAKAA,mBAAA,WACA,IAAA5G,EAAAvM,KAGAoT,EAAAzI,EAAA,OACA0I,EAAA1I,EAAA,OACA2I,EAAA3I,EAAA,OAEAiG,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IAEAyC,KAAA,EAEAhI,MAAA,OAEAqI,IAAA,sJAA8FkD,EAAA,0IAAmKC,EAAA,wOAA8JF,EAAA,0FAE/Z7C,OAAA,EAEAnO,SAAA,IAAAgR,EACAtP,KAAA,QACAX,GAAA,WACA,IAAAoQ,EAAAC,SAAAxQ,EAAA,IAAAqQ,GAAA9O,OACAkP,EAAAD,SAAAxQ,EAAA,IAAAsQ,GAAA/O,OAQA,OANAgP,GAAAE,GAAAF,EAAA,GAAAE,EAAA,GAEAlH,EAAAyG,QAAAO,EAAAE,IAIA,SAQA7C,EAAAtL,OAGAtF,KAAA4Q,SAIAoC,QAAA,SAAAO,EAAAE,GAEA,IAAAC,OAAA,EACAC,OAAA,EACA7R,EAAA,kEACA,IAAA4R,EAAA,EAAmBA,EAAAH,EAAYG,IAAA,CAE/B,GADA5R,GAAA,OACA,IAAA4R,EACA,IAAAC,EAAA,EAA2BA,EAAAF,EAAYE,IACvC7R,GAAA,uBAGA,IAAA6R,EAAA,EAA2BA,EAAAF,EAAYE,IACvC7R,GAAA,kBAGAA,GAAA,QAEAA,GAAA,sBAGA,IAAAyH,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,aAAA7J,GAGAyH,EAAAmC,IAAAC,GAAA,2BACApC,EAAAmC,IAAAC,GAAA,gCAIAuH,iBAAA,WACA,IAAAU,EAAA5T,KAGA6T,EAAAlJ,EAAA,WACAmJ,EAAAnJ,EAAA,WACAoJ,EAAApJ,EAAA,WACAqJ,EAAArJ,EAAA,WACAsJ,EAAAtJ,EAAA,aAGAiG,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IAEAyC,KAAA,EAEAhI,MAAA,OAEAqI,IAAA,4LAAmK0D,EAAA,wEAAAE,EAAA,4EAAAD,EAAA,wEAAAE,EAAA,wKAAAC,EAAA,+FAEnK1D,OAAA,EAEAnO,SAAA,IAAAyR,EACA/P,KAAA,QACAX,GAAA,WAGA,OAFAyQ,EAAAM,WAEA,IAEiB,CAEjB9R,SAAA,IAAA0R,EACAhQ,KAAA,QACAX,GAAA,WAGA,OAFAyQ,EAAAO,WAEA,IAEiB,CAEjB/R,SAAA,IAAA2R,EACAjQ,KAAA,QACAX,GAAA,WAGA,OAFAyQ,EAAAQ,WAEA,IAEiB,CAEjBhS,SAAA,IAAA4R,EACAlQ,KAAA,QACAX,GAAA,WAGA,OAFAyQ,EAAAS,WAEA,IAEiB,CAEjBjS,SAAA,IAAA6R,EACAnQ,KAAA,QACAX,GAAA,WAGA,OAFAyQ,EAAAU,aAEA,SAMA1D,EAAAtL,QAIAiP,iBAAA,WACA,IAAAhS,EAAA,GACAgH,EAAAvJ,KAAAuJ,OACAmI,EAAAnI,EAAAgC,UAAAyC,4BACA,GAAA0D,EAAA,CAGA,IAAAnL,EAAAmL,EAAApL,cACA,UAAAC,GAAA,OAAAA,EAAA,CAKA,IAAAiO,EAAA9C,EAAA5L,SACA2O,EAAAD,EAAAtS,WACAwS,EAAAD,EAAA/T,OACA+T,EAAAvR,QAAA,SAAAyR,EAAAnU,GACA,GAAAmU,IAAAjD,EAAA,GAOA,OALAnP,EAAAoS,GAAA,CACAnU,QACA4C,KAAAuR,EACAjU,OAAAgU,IAEA,IAKA,IAAAE,EAAAJ,EAAA1O,SACA+O,EAAAD,EAAA1S,WACA4S,EAAAD,EAAAnU,OAcA,OAbAmU,EAAA3R,QAAA,SAAA6R,EAAAvU,GACA,GAAAuU,IAAAP,EAAA,GAOA,OALAjS,EAAAwS,GAAA,CACAvU,QACA4C,KAAA2R,EACArU,OAAAoU,IAEA,IAKAvS,KAIA2R,QAAA,WAEA,IAAAc,EAAAhV,KAAAuU,mBACA,GAAAS,EAAA,CAGA,IAAAC,EAAAD,EAAAD,GACAG,EAAAlS,EAAAiS,EAAA7R,MACA+R,EAAAH,EAAAL,GACAD,EAAAS,EAAAzU,OAGA0U,EAAA5T,SAAAQ,cAAA,MACAmO,EAAA,GACAxO,OAAA,EACA,IAAAA,EAAA,EAAmBA,EAAA+S,EAAc/S,IACjCwO,GAAA,kBAEAiF,EAAAnT,UAAAkO,EAEAnN,EAAAoS,GAAA/N,YAAA6N,KAIAf,QAAA,WAEA,IAAAa,EAAAhV,KAAAuU,mBACA,GAAAS,EAAA,CAGA,IAAAC,EAAAD,EAAAD,GACAI,EAAAH,EAAAL,GACAU,EAAAF,EAAA3U,MACA0U,EAAAlS,EAAAiS,EAAA7R,MACAkS,EAAAJ,EAAApP,SACA+O,EAAAS,EAAApT,WAGA2S,EAAA3R,QAAA,SAAA6R,GACA,IAAAP,EAAAxR,EAAA+R,GACAN,EAAAD,EAAAtS,WACAqT,EAAAd,EAAA/Q,IAAA2R,GACAG,EAAAD,EAAAjP,cAAAmP,cAGAC,EAAAlU,SAAAQ,cAAAwT,GACAxS,EAAA0S,GAAArO,YAAAkO,OAKAnB,QAAA,WAEA,IAAAY,EAAAhV,KAAAuU,mBACA,GAAAS,EAAA,CAGA,IAAAC,EAAAD,EAAAD,GACAG,EAAAlS,EAAAiS,EAAA7R,MACA8R,EAAArP,WAIAwO,QAAA,WAEA,IAAAW,EAAAhV,KAAAuU,mBACA,GAAAS,EAAA,CAGA,IAAAC,EAAAD,EAAAD,GACAI,EAAAH,EAAAL,GACAU,EAAAF,EAAA3U,MACA0U,EAAAlS,EAAAiS,EAAA7R,MACAkS,EAAAJ,EAAApP,SACA+O,EAAAS,EAAApT,WAGA2S,EAAA3R,QAAA,SAAA6R,GACA,IAAAP,EAAAxR,EAAA+R,GACAN,EAAAD,EAAAtS,WACAqT,EAAAd,EAAA/Q,IAAA2R,GAEAE,EAAA1P,aAKAyO,UAAA,WACA,IAAA/K,EAAAvJ,KAAAuJ,OACAmI,EAAAnI,EAAAgC,UAAAyC,4BACA,GAAA0D,EAAA,CAGA,IAAAiE,EAAAjE,EAAA9K,YAAA,SACA+O,GAGAA,EAAA9P,WAIAiG,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACA0K,EAAAnI,EAAAgC,UAAAyC,4BACA,GAAA0D,EAAA,CAGA,IAAAnL,EAAAmL,EAAApL,cACA,OAAAC,GAAA,OAAAA,GACAvG,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,kBAmBAuK,EAAAzO,UAAA,CACAoC,YAAAqM,EAEAjE,QAAA,WACArL,KAAA+Q,gBAGAA,aAAA,WACA,IAAAxE,EAAAvM,KAGA4V,EAAAjL,EAAA,YACA2H,EAAA3H,EAAA,OAGAiG,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IAEAyC,KAAA,EAEAhI,MAAA,OAEAqI,IAAA,6CAAAyF,EAAA,mLAAAtD,EAAA,0FAEA/B,OAAA,EACAnO,SAAA,IAAAkQ,EACAxO,KAAA,QACAX,GAAA,WACA,IAAAoO,EAAAvO,EAAA,IAAA4S,GACArR,EAAAgN,EAAAhN,MAAAzB,OAWA,OANAyB,GAEAgI,EAAAyG,QAAAzO,IAIA,SAQAqM,EAAAtL,OAGAtF,KAAA4Q,SAIAoC,QAAA,SAAAzO,GACA,IAAAgF,EAAAvJ,KAAAuJ,OACAA,EAAAmC,IAAAC,GAAA,aAAApH,EAAA,iBAoBAgL,EAAA1O,UAAA,CACAoC,YAAAsM,EAEAlE,QAAA,WACA,IAAA9B,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OACAA,EAAAoC,QAGA7J,KAAAoL,QACApL,KAAAkT,mBAEAlT,KAAAmT,uBAIAD,iBAAA,WACA,IAAA3J,EAAAvJ,KAAAuJ,OAGAsM,EAAAlL,EAAA,YACAmL,EAAAnL,EAAA,YACAoL,EAAApL,EAAA,aACAqL,EAAArL,EAAA,WAGAsL,EAAA,EACAnO,MAAA,OACAqI,IAAA,mSAA8P0F,EAAA,oEAAAC,EAAA,oEAAAC,EAAA,yJAAAC,EAAA,uFAC9PzF,OAAA,EACAnO,SAAA,IAAAyT,EACA/R,KAAA,QACAX,GAAA,WACA,IAAA+S,EAAA3M,EAAA4M,aAKA,OAJAD,GACAA,EAAAlR,IAAA,oBAGA,IAEa,CACb5C,SAAA,IAAA0T,EACAhS,KAAA,QACAX,GAAA,WACA,IAAA+S,EAAA3M,EAAA4M,aAKA,OAJAD,GACAA,EAAAlR,IAAA,oBAGA,IAEa,CACb5C,SAAA,IAAA2T,EACAjS,KAAA,QACAX,GAAA,WACA,IAAA+S,EAAA3M,EAAA4M,aAKA,OAJAD,GACAA,EAAAlR,IAAA,qBAGA,IAEa,CACb5C,SAAA,IAAA4T,EACAlS,KAAA,QACAX,GAAA,WACA,IAAA+S,EAAA3M,EAAA4M,aAKA,OAJAD,GACAA,EAAArQ,UAGA,OAMA+K,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IACAyC,KAAAmG,IAEArF,EAAAtL,OAGAtF,KAAA4Q,SAGAuC,mBAAA,WACA,IAAA5J,EAAAvJ,KAAAuJ,OACA6M,EAAA7M,EAAA6M,UACA3O,EAAA8B,EAAA9B,OAGA4O,EAAA1L,EAAA,cACA2L,EAAA3L,EAAA,WACA4L,EAAA5L,EAAA,YACA6L,EAAA7L,EAAA,YAGAsL,EAAA,EACAnO,MAAA,OACAqI,IAAA,oEAAAkG,EAAA,oMAAgQC,EAAA,sJAChQ/F,OAAA,EAEAnO,SAAA,IAAAiU,EACAvS,KAAA,QACAX,GAAA,WACA,IAAAsT,EAAAzT,EAAA,IAAAsT,GACAI,EAAAD,EAAA,GACA,IAAAC,EAIA,SAHAA,EAAAC,UAMa,CAEbvU,SAAA,IAAAkU,EACAxS,KAAA,SACAX,GAAA,WACA,IAAAsT,EAAAzT,EAAA,IAAAsT,GACAI,EAAAD,EAAA,GACA,IAAAC,EAEA,SAIA,IAAAE,EAAAF,EAAAlN,MAMA,OALAoN,EAAAlW,QACA0V,YAAAQ,IAIA,MAIA,CACA9O,MAAA,OACAqI,IAAA,yCAAAoG,EAAA,sJAAAC,EAAA,kFACAjG,OAAA,EACAnO,SAAA,IAAAoU,EACA1S,KAAA,QACAX,GAAA,WACA,IAAA0T,EAAA7T,EAAA,IAAAuT,GACA3N,EAAAiO,EAAAtS,MAAAzB,OAOA,OALA8F,GACAwN,EAAAU,cAAAlO,IAIA,OAOAmO,EAAA,IACAtP,EAAAqB,qBAAArB,EAAAuP,iBAAAvP,EAAAwP,kBAAA3M,OAAA4M,YAEAH,EAAAvT,KAAAyS,EAAA,IAEAxO,EAAAiB,aAEAqO,EAAAvT,KAAAyS,EAAA,IAIA,IAAArF,EAAA,IAAAtC,EAAAtO,KAAA,CACAqN,MAAA,IACAyC,KAAAiH,IAEAnG,EAAAtL,OAGAtF,KAAA4Q,SAIA9E,gBAAA,SAAA5H,GACA,IAAAqF,EAAAvJ,KAAAuJ,OACAvC,EAAAhH,KAAAgH,MACAuC,EAAA4M,cACAnW,KAAAoL,SAAA,EACApE,EAAAtC,SAAA,gBAEA1E,KAAAoL,SAAA,EACApE,EAAAjC,YAAA,iBAUA,IAAAoS,EAAA,GA8CA,SAAAC,EAAA7N,GACAvJ,KAAAuJ,SACAvJ,KAAA0H,MAAA,GA0HA,SAAA2P,EAAAnT,GACA,IAAAoT,EAAApT,EAAAoT,eAAApT,EAAAqT,eAAArT,EAAAqT,cAAAD,cACAE,OAAA,EAOA,OALAA,EADA,MAAAF,EACAhN,OAAAgN,eAAAhN,OAAAgN,cAAAG,QAAA,QAEAH,EAAAG,QAAA,cAGAxM,EAAAuM,GAIA,SAAAE,EAAAxT,EAAAyT,EAAAC,GACA,IAAAN,EAAApT,EAAAoT,eAAApT,EAAAqT,eAAArT,EAAAqT,cAAAD,cACAE,OAAA,EACAK,OAAA,EAUA,GATA,MAAAP,EACAE,EAAAlN,OAAAgN,eAAAhN,OAAAgN,cAAAG,QAAA,SAEAD,EAAAF,EAAAG,QAAA,cACAI,EAAAP,EAAAG,QAAA,eAEAI,GAAAL,IACAK,EAAA,MAAA5M,EAAAuM,GAAA,QAEAK,EAAA,CAKA,IAAAC,EAAAD,EAAA7T,MAAA,WAyBA,OAxBA,IAAA8T,EAAApX,SACAmX,EAAAC,EAAA,IAIAD,IAAAhV,QAAA,iCAEAgV,IAAAhV,QAAA,mBAEAgV,IAAAhV,QAAA,mCAEA+U,IAEAC,IAAAhV,QAAA,mBAKAgV,EAFAF,EAEAE,EAAAhV,QAAA,wCAGAgV,EAAAhV,QAAA,gCAGAgV,GAIA,SAAAE,EAAA7T,GACA,IAAA3B,EAAA,GACAyV,EAAAX,EAAAnT,GACA,GAAA8T,EAEA,OAAAzV,EAGA,IAAA+U,EAAApT,EAAAoT,eAAApT,EAAAqT,eAAArT,EAAAqT,cAAAD,eAAA,GACAW,EAAAX,EAAAW,MACA,OAAAA,GAIA1N,EAAA0N,EAAA,SAAA3T,EAAAoC,GACA,IAAA5C,EAAA4C,EAAA5C,KACA,SAAAsG,KAAAtG,IACAvB,EAAAiB,KAAAkD,EAAAwR,eAIA3V,GAVAA,EAkBA,SAAA4V,EAAAnR,GACA,IAAAzE,EAAA,GACAmD,EAAAsB,EAAAxB,cAAA,GAmCA,OAlCAE,EAAAxC,QAAA,SAAAkV,GACA,IAAAC,OAAA,EACA3V,EAAA0V,EAAA1V,SASA,GANA,IAAAA,IACA2V,EAAAD,EAAAE,YACAD,EAAApN,EAAAoN,IAIA,IAAA3V,EAAA,CACA2V,EAAA,GAGAA,EAAAE,IAAAH,EAAA7R,SAAAkP,cAKA,IAHA,IAAA+C,EAAA,GACAC,EAAAL,EAAAM,YAAA,GACAC,EAAAF,EAAA/X,QAAA,EACAiB,EAAA,EAA2BA,EAAAgX,EAAoBhX,IAAA,CAC/C,IAAA0C,EAAAoU,EAAA9W,GACA6W,EAAAhV,KAAA,CACAgS,KAAAnR,EAAAmR,KACA9O,MAAArC,EAAAqC,QAGA2R,EAAAO,MAAAJ,EAEAH,EAAAnW,SAAAiW,EAAAnV,EAAAoV,IAGA7V,EAAAiB,KAAA6U,KAEA9V,EAIA,SAAAsW,EAAAtP,GACAvJ,KAAAuJ,SAwfA,SAAAuP,EAAAvP,GACAvJ,KAAAuJ,SAqGA,SAAAwP,EAAAxP,GACAvJ,KAAAuJ,SACAvJ,KAAAgZ,cAAA,KAmLA,SAAAC,EAAA1P,GACAvJ,KAAAuJ,SACAvJ,KAAAkZ,MAAA,EACAlZ,KAAAmZ,SAAA,EACAnZ,KAAAoZ,WAAA,EACApZ,KAAAqZ,WAAA,EACArZ,KAAAsZ,eAAA/P,EAAAmG,mBACA1P,KAAAuZ,KAAAvW,EAAA,oCArkCAmU,EAAAqC,KAAArO,EAEAgM,EAAAsC,KAAAtM,EAEAgK,EAAAuC,SAAAnM,EAEA4J,EAAA1J,SAAAD,EAEA2J,EAAA9O,KAAAkG,EAEA4I,EAAAwC,OAAAnL,EAEA2I,EAAAyC,KAAAnL,EAEA0I,EAAA0C,cAAAnL,EAEAyI,EAAA2C,UAAAnL,EAEAwI,EAAA4C,KAAAnL,EAEAuI,EAAAxK,KAAAkC,EAEAsI,EAAA6C,QAAAlL,EAEAqI,EAAA8C,UAAAlL,EAEAoI,EAAA+C,UAAAjL,EAEAkI,EAAAgD,MAAAjL,EAEAiI,EAAAiD,KAAAjL,EAEAgI,EAAAkD,SAAAjL,EAEA+H,EAAAmD,MAAAjL,EAEA8H,EAAAoD,MAAAjL,EAEA6H,EAAAqD,MAAAjL,EAYA6H,EAAAvW,UAAA,CACAoC,YAAAmU,EAGAqD,KAAA,WACA,IAAAlO,EAAAvM,KAEAuJ,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,QAAA,GACAiT,EAAAjT,EAAAC,OAAA,GAGAgT,EAAAxX,QAAA,SAAAyX,GACA,IAAAC,EAAAzD,EAAAwD,GACAC,GAAA,oBAAAA,IAEArO,EAAA7E,MAAAiT,GAAA,IAAAC,EAAArR,MAKAvJ,KAAA6a,gBAGA7a,KAAA8a,cAIAD,cAAA,WACA,IAAAtR,EAAAvJ,KAAAuJ,OACAwR,EAAAxR,EAAAwR,aACArT,EAAA1H,KAAA0H,MACAD,EAAA8B,EAAA9B,OAEAS,EAAAT,EAAAS,OAAA,EACAqC,EAAA7C,EAAA,SAAApD,EAAA+H,GACA,IAAArF,EAAAqF,EAAArF,MACAA,IAEAA,EAAAhC,IAAA,UAAAkD,GACA6S,EAAAtV,OAAAuB,OAMA8T,WAAA,WACA,IAAApT,EAAA1H,KAAA0H,MACA6B,EAAAvJ,KAAAuJ,OACAgB,EAAA7C,EAAA,SAAApD,EAAA+H,GACA,IAAAvI,EAAAuI,EAAAvI,KACA,GAAAA,EAAA,CAGA,IAAAkD,EAAAqF,EAAArF,MACAoG,EAAAf,EAAAe,SACAf,EAAAuE,MAGA,UAAA9M,GAAAuI,EAAAhB,SACArE,EAAAnD,GAAA,iBAAAK,GACA,MAAAqF,EAAAgC,UAAAyP,YAGA3O,EAAAhB,QAAAnH,KAKA,aAAAJ,GAAAsJ,GACApG,EAAAnD,GAAA,sBAAAK,GACA,MAAAqF,EAAAgC,UAAAyP,aAIA5N,EAAAU,cAAAd,WAAA,WACAI,EAAA9H,QACqB,QACJzB,GAAA,sBAAAK,GAEjBkJ,EAAAL,cAAAC,WAAA,WACAI,EAAA7H,QACqB,KAKrB,UAAAzB,GAAAuI,EAAAhB,SACArE,EAAAnD,GAAA,iBAAAK,GACAA,EAAAoM,kBACA,MAAA/G,EAAAgC,UAAAyP,YAIA3O,EAAAhB,QAAAnH,SAOA+W,aAAA,WACA,IAAAvT,EAAA1H,KAAA0H,MACA6C,EAAA7C,EAAA,SAAApD,EAAA+H,GACAA,EAAAP,iBACAkB,WAAA,WACAX,EAAAP,mBACiB,SAkJjB+M,EAAAhY,UAAA,CACAoC,YAAA4V,EAGA4B,KAAA,WAEAza,KAAA8a,cAIAI,MAAA,WACAlb,KAAA8B,KAAA,gBAIAA,KAAA,SAAAyC,GACA,IAAAgF,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UACAnM,OAAA,EACA,SAAAyC,EAIA,OAHAzC,EAAAmM,EAAAnM,OAEAA,IAAAe,QAAA,eACAf,EAEAmM,EAAAnM,KAAAyC,GAGAgF,EAAA4R,iBAKAC,QAAA,WACA,IAAA7R,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UACA,OAAAkK,EAAAlK,IAIAxH,KAAA,SAAAlC,GACA,IAAAgF,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UACAxH,OAAA,EACA,SAAAlC,EAIA,OAHAkC,EAAAwH,EAAAxH,OAEAA,IAAA5D,QAAA,eACA4D,EAEAwH,EAAAxH,KAAA,MAAAlC,EAAA,QAGAgF,EAAA4R,iBAKA1V,OAAA,SAAA3D,GACA,IAAAyH,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UACAA,EAAAxI,OAAAzC,EAAAlB,IAGAyH,EAAA4R,iBAIAL,WAAA,WAEA9a,KAAAqb,qBAGArb,KAAAsb,kBAGAtb,KAAAub,eAGAvb,KAAAwb,eAGAxb,KAAAyb,aAGAzb,KAAA0b,aAGA1b,KAAA2b,eAIAN,mBAAA,WACA,IAAA9R,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAGA,SAAA2N,EAAA1X,GAEAqF,EAAAgC,UAAAqQ,YAEArS,EAAA7B,MAAAuT,eAGAhN,EAAApK,GAAA,QAAA+X,GACA3N,EAAApK,GAAA,qBAAAK,GAEA+J,EAAApK,GAAA,aAAA+X,KAEA3N,EAAApK,GAAA,mBAAAK,GACA0X,IAEA3N,EAAA9J,IAAA,aAAAyX,MAKAN,gBAAA,WACA,IAAA/R,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAEA,SAAA4N,EAAA9N,GACA,IAAA+N,EAAA9Y,EAAA,eACA8Y,EAAA7U,aAAA8G,GACAxE,EAAAgC,UAAAuF,kBAAAgL,GAAA,GACAvS,EAAAgC,UAAAM,mBACAkC,EAAAlI,SAIA,SAAAkW,EAAA7X,GACA,IAAA6J,EAAAxE,EAAAgC,UAAAyC,4BACAyE,EAAA1E,EAAAjI,SAEA,yBAAA2M,EAAA3Q,QAOA,GAAA2Q,EAAA1L,MAAAkH,GAAA,CAKA,IAAA1H,EAAAwH,EAAAzH,cACA,MAAAC,IAKAwH,EAAAtH,QAMAoV,EAAA9N,UArBA8N,EAAA9N,GAkCA,SAAAiO,EAAA9X,GACA,IAAA6J,EAAAxE,EAAAgC,UAAAyC,4BACA,GAAAD,EAAA,CAGA,IAAA0E,EAAA1E,EAAAjI,SACAmW,EAAAlO,EAAAzH,cACA4V,EAAAzJ,EAAAnM,cAEA,YAAA2V,GAAA,QAAAC,GAKA3S,EAAAmC,IAAAyQ,sBAAA,eAMA,QAAA5S,EAAA6S,eAAA,CAGA,IAAAN,EAAA9Y,EAAA,eASA,OARA8Y,EAAAzU,YAAAoL,GACAlJ,EAAAgC,UAAAuF,kBAAAgL,GAAA,GACAvS,EAAAgC,UAAAM,mBAGAtC,EAAA6S,gBAAA,OAEAlY,EAAAmY,iBAIA,IAAAC,EAAA/S,EAAAgC,UAAAyP,WAAAuB,YAGAhT,EAAAmC,IAAAC,GAAA,mBACApC,EAAAgC,UAAAqQ,YACArS,EAAAgC,UAAAyP,WAAAuB,cAAAD,GAEA/S,EAAAmC,IAAAC,GAAA,mBAGA,IAAA6Q,EAAAzO,EAAAjM,OAAApB,OACA6I,EAAAgC,UAAAyP,WAAAuB,YAAA,IAAAC,IAGAjT,EAAA6S,gBAAA,GAIAlY,EAAAmY,mBA/DApO,EAAApK,GAAA,iBAAAK,GACA,KAAAA,EAAAuY,SAKAV,EAAA7X,KA4DA+J,EAAApK,GAAA,mBAAAK,GACA,KAAAA,EAAAuY,QAOAT,EAAA9X,GAJAqF,EAAA6S,gBAAA,KASAb,aAAA,WACA,IAAAhS,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAEAA,EAAApK,GAAA,mBAAAK,GACA,OAAAA,EAAAuY,QAAA,CAGA,IAAAC,EAAAzO,EAAAnM,OAAA2T,cAAA3S,OACA,gBAAA4Z,GAEAxY,EAAAmY,oBAKApO,EAAApK,GAAA,iBAAAK,GACA,OAAAA,EAAAuY,QAAA,CAGA,IAAAX,OAAA,EACAY,EAAAzO,EAAAnM,OAAA2T,cAAA3S,OAGA4Z,GAAA,SAAAA,IAEAZ,EAAA9Y,EAAA,gBACAiL,EAAAnM,KAAA,IACAmM,EAAAxI,OAAAqW,GACAvS,EAAAgC,UAAAuF,kBAAAgL,GAAA,MACAvS,EAAAgC,UAAAM,wBAMA2P,aAAA,WACA,IAAAjS,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OACAc,EAAAd,EAAAc,iBACAE,EAAAhB,EAAAgB,gBACAmP,EAAAnQ,EAAAe,eACAyF,EAAA1E,EAAA0E,UAIA0O,EAAA,EACA,SAAAC,IACA,IAAAC,EAAAC,KAAAD,MACAE,GAAA,EAMA,OALAF,EAAAF,GAAA,MAEAI,GAAA,GAEAJ,EAAAE,EACAE,EAEA,SAAAC,IACAL,EAAA,EAIA1O,EAAApK,GAAA,iBAAAK,GACA,IAAA4F,EAAAO,SAIAnG,EAAAmY,iBAIAO,KAAA,CAKA,IAAA/E,EAAAH,EAAAxT,EAAAqE,EAAAqP,GACAJ,EAAAH,EAAAnT,GACAsT,IAAA3U,QAAA,eAEA,IAAAkL,EAAAxE,EAAAgC,UAAAyC,4BACA,GAAAD,EAAA,CAGA,IAAAxH,EAAAwH,EAAAzH,cAGA,YAAAC,GAAA,QAAAA,EAMA,OALAkC,GAAAyC,EAAAzC,KAEA+O,EAAA,IAAA/O,EAAA+O,IAAA,UAEAjO,EAAAmC,IAAAC,GAAA,mBAAA6L,EAAA,QAUA,GAAAK,EAKA,IAGApP,GAAAyC,EAAAzC,KAEAoP,EAAA,IAAApP,EAAAoP,IAAA,KAEAtO,EAAAmC,IAAAC,GAAA,aAAAkM,GACa,MAAAoF,GAEbxU,GAAAyC,EAAAzC,KAEA+O,EAAA,IAAA/O,EAAA+O,IAAA,KAEAjO,EAAAmC,IAAAC,GAAA,mBAAA6L,EAAA,aAjBAwF,QAsBA/O,EAAApK,GAAA,iBAAAK,GACA,IAAA4F,EAAAO,SAGAnG,EAAAmY,iBAIAO,KAAA,CAKA,IAAAM,EAAAnF,EAAA7T,GACA,GAAAgZ,KAAAxc,OAAA,CAKA,IAAAqN,EAAAxE,EAAAgC,UAAAyC,4BACA,GAAAD,EAAA,CAGA,IAAAxH,EAAAwH,EAAAzH,cAGA,YAAAC,GAAA,QAAAA,EAAA,CAKA,IAAA6P,EAAA7M,EAAA6M,UACAA,YAAA8G,UAKAzB,WAAA,WACA,IAAAlS,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAEAA,EAAApK,GAAA,mBAAAK,GACA,OAAAA,EAAAuY,SAGAlT,EAAAmC,IAAAyQ,sBAAA,eAIA,IAAApO,EAAAxE,EAAAgC,UAAAyC,4BACA,GAAAD,EAAA,CAGA,IAAA0E,EAAA1E,EAAAjI,SACAmW,EAAAlO,EAAAzH,cACA4V,EAAAzJ,EAAAnM,cAEA,SAAA2V,GAAA,QAAAC,EAEA3S,EAAAmC,IAAAC,GAAA,qBAGApC,EAAAmC,IAAAC,GAAA,yCAGAzH,EAAAmY,sBAKAX,WAAA,WACA,IAAAnS,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UAGAA,EAAApK,GAAA,uBAAAK,GACA,IAAAiZ,EAAAnd,KACAkW,EAAAlT,EAAAma,GAEA,MAAAjH,EAAA7R,KAAA,cAMAkF,EAAA4M,aAAAD,EAGA3M,EAAAgC,UAAAuF,kBAAAoF,GACA3M,EAAAgC,UAAAM,sBAIAoC,EAAApK,GAAA,wBAAAK,GACAA,EAAA9D,OAAAa,QAAA,SAKAsI,EAAA4M,aAAA,SAKAwF,YAAA,WACA,IAAApS,EAAAvJ,KAAAuJ,OAGA6T,EAAApa,EAAAxB,UACA4b,EAAAvZ,GAAA,6CAAAK,GACAA,EAAAmY,mBAIA,IAAApO,EAAA1E,EAAA0E,UACAA,EAAApK,GAAA,gBAAAK,GACAA,EAAAmY,iBACA,IAAA7S,EAAAtF,EAAAmZ,cAAAnZ,EAAAmZ,aAAA7T,MACA,GAAAA,KAAA9I,OAAA,CAKA,IAAA0V,EAAA7M,EAAA6M,UACAA,YAAA5M,QAeAsP,EAAAjY,UAAA,CACAoC,YAAA6V,EAGAnN,GAAA,SAAA6J,EAAA9O,GACA,IAAA6C,EAAAvJ,KAAAuJ,OASA,GANAA,EAAA+T,mBACA9b,SAAA+b,YAAA,wBACAhU,EAAA+T,kBAAA,GAIA/T,EAAAgC,UAAAyP,WAAA,CAKAzR,EAAAgC,UAAAM,mBAGA,IAAA2R,EAAA,IAAAhI,EACAxV,KAAAwd,GAEAxd,KAAAwd,GAAA9W,GAGA1G,KAAAyd,aAAAjI,EAAA9O,GAIA6C,EAAA7B,MAAAuT,eAGA1R,EAAAgC,UAAAqQ,YACArS,EAAAgC,UAAAM,mBAGAtC,EAAAmU,QAAAnU,EAAAmU,WAIAC,YAAA,SAAA7b,GACA,IAAAyH,EAAAvJ,KAAAuJ,OACAqU,EAAArU,EAAAgC,UAAAyP,WAEAhb,KAAAmc,sBAAA,cAEAnc,KAAAyd,aAAA,aAAA3b,GACS8b,EAAAC,YAETD,EAAAE,iBACAF,EAAAC,WAAA7a,EAAAlB,GAAA,KACS8b,EAAAG,WAETH,EAAAG,UAAAjc,IAKAkc,YAAA,SAAAhX,GACA,IAAAuC,EAAAvJ,KAAAuJ,OACAqU,EAAArU,EAAAgC,UAAAyP,WAEA4C,EAAAC,aACAD,EAAAE,iBACAF,EAAAC,WAAA7W,EAAA,MAKAyW,aAAA,SAAAjI,EAAA9O,GACAlF,SAAA+b,YAAA/H,GAAA,EAAA9O,IAIAyH,kBAAA,SAAAqH,GACA,OAAAhU,SAAA2M,kBAAAqH,IAIAzJ,kBAAA,SAAAyJ,GACA,OAAAhU,SAAAuK,kBAAAyJ,IAIA2G,sBAAA,SAAA3G,GACA,OAAAhU,SAAA2a,sBAAA3G,KAeAuD,EAAAlY,UAAA,CACAoC,YAAA8V,EAGAiC,SAAA,WACA,OAAAhb,KAAAgZ,eAIA4C,UAAA,SAAAqC,GACA,GAAAA,EAEAje,KAAAgZ,cAAAiF,MAFA,CAOA,IAAA1S,EAAAjB,OAAA4T,eACA,OAAA3S,EAAA4S,WAAA,CAGA,IAAAP,EAAArS,EAAA6S,WAAA,GAGAC,EAAAre,KAAAgO,0BAAA4P,GACA,GAAAS,GAKA,UAAAA,EAAAha,KAAA,qBAAAga,EAAAzX,YAAA,4BAIA,IAAA2C,EAAAvJ,KAAAuJ,OACA0E,EAAA1E,EAAA0E,UACAA,EAAAhI,UAAAoY,KAEAre,KAAAgZ,cAAA4E,OAKAhS,cAAA,SAAA0S,GACA,MAAAA,IAEAA,GAAA,GAEA,IAAAV,EAAA5d,KAAAgZ,cACA4E,GACAA,EAAAW,SAAAD,IAKAtN,iBAAA,WACA,IAAA4M,EAAA5d,KAAAgZ,cACA,OAAA4E,EACA5d,KAAAgZ,cAAAjO,WAEA,IAKAiD,0BAAA,SAAA4P,GACAA,KAAA5d,KAAAgZ,cACA,IAAA5V,OAAA,EACA,GAAAwa,EAEA,OADAxa,EAAAwa,EAAAY,wBACAxb,EAAA,IAAAI,EAAAV,SAAAU,IAAAgE,aAGA6K,sBAAA,SAAA2L,GACAA,KAAA5d,KAAAgZ,cACA,IAAA5V,OAAA,EACA,GAAAwa,EAEA,OADAxa,EAAAwa,EAAAa,eACAzb,EAAA,IAAAI,EAAAV,SAAAU,IAAAgE,aAGA+K,oBAAA,SAAAyL,GACAA,KAAA5d,KAAAgZ,cACA,IAAA5V,OAAA,EACA,GAAAwa,EAEA,OADAxa,EAAAwa,EAAAc,aACA1b,EAAA,IAAAI,EAAAV,SAAAU,IAAAgE,aAKAoE,iBAAA,WACA,IAAAoS,EAAA5d,KAAAgZ,cACA,SAAA4E,MAAAa,gBACAb,EAAAa,iBAAAb,EAAAc,cACAd,EAAArB,cAAAqB,EAAAe,YASA9S,iBAAA,WACA,IAAAN,EAAAjB,OAAA4T,eACA3S,EAAAqT,kBACArT,EAAAsT,SAAA7e,KAAAgZ,gBAIAvN,iBAAA,WACA,IAAAlC,EAAAvJ,KAAAuJ,OACAqU,EAAA5d,KAAAgb,WACAhU,OAAA,EAEA,GAAA4W,GAIA5d,KAAAwL,mBAKA,IAEA1B,EAAAI,YAEAX,EAAAmC,IAAAC,GAAA,wBAEAiS,EAAAkB,OAAAlB,EAAAc,aAAAd,EAAAe,UAAA,GAEA3e,KAAA4b,UAAAgC,KAEA5W,EAAAhE,EAAA,4BACAuG,EAAAmC,IAAAC,GAAA,aAAA3E,GACAhH,KAAA8Q,kBAAA9J,GAAA,IAES,MAAAiW,MAMTnM,kBAAA,SAAA9J,EAAAsX,EAAAS,GAIA,GAAA/X,EAAAtG,OAAA,CAIA,IAAA0C,EAAA4D,EAAA,GACA4W,EAAApc,SAAAwd,cAEAD,EACAnB,EAAAqB,mBAAA7b,GAEAwa,EAAAsB,WAAA9b,GAGA,mBAAAkb,GACAV,EAAAW,SAAAD,GAIAte,KAAA4b,UAAAgC,MAkBA3E,EAAApY,UAAA,CACAoC,YAAAgW,EAEA3T,KAAA,SAAA6Z,GACA,IAAA5S,EAAAvM,KAGA,IAAAA,KAAAmZ,QAAA,CAGAnZ,KAAAmZ,SAAA,EAGA,IAAAI,EAAAvZ,KAAAuZ,KACA,GAAAvZ,KAAAoZ,UAIApZ,KAAAoZ,WAAA,MAJA,CACA,IAAAE,EAAAtZ,KAAAsZ,eACAA,EAAA7T,OAAA8T,GAMAuD,KAAAD,MAAA7c,KAAAkZ,MAAA,KACAiG,GAAA,IACA5F,EAAAvU,IAAA,YAAAma,EAAA,KACAnf,KAAAkZ,MAAA4D,KAAAD,OAKA,IAAAuC,EAAApf,KAAAqZ,WACA+F,GACA1R,aAAA0R,GAEAA,EAAApS,WAAA,WACAT,EAAA8S,SACS,OAGTA,MAAA,WACA,IAAA9F,EAAAvZ,KAAAuZ,KACAA,EAAA1T,SAGA7F,KAAAkZ,MAAA,EACAlZ,KAAAmZ,SAAA,EACAnZ,KAAAoZ,WAAA,IAIA,IAAAkG,EAAA,oBAAAC,QAAA,kBAAAA,OAAAC,SAAA,SAAAhV,GACA,cAAAA,GACC,SAAAA,GACD,OAAAA,GAAA,oBAAA+U,QAAA/U,EAAAvH,cAAAsc,QAAA/U,IAAA+U,OAAA1e,UAAA,gBAAA2J,GAQA,SAAAiV,EAAAlW,GACAvJ,KAAAuJ,SAIAkW,EAAA5e,UAAA,CACAoC,YAAAwc,EAGAC,OAAA,SAAAC,EAAAC,GACA,IAAArW,EAAAvJ,KAAAuJ,OACApB,EAAAoB,EAAA9B,OAAAU,MACA0X,EAAAtW,EAAA9B,OAAAoY,YAEA,GAAA1X,EACA,UAAA2X,MAAA,gBAAAF,GAAAD,IAEAE,GAAA,oBAAAA,EACAA,EAAAF,GAEA9N,MAAA8N,IAMA7I,cAAA,SAAAzO,GACA,IAAAuL,EAAA5T,KAEA,GAAAqI,EAAA,CAGA,IAAAkB,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OAGAa,EAAAb,EAAAa,aACAsJ,OAAA,EACA,GAAAtJ,GAAA,oBAAAA,IACAsJ,EAAAtJ,EAAAD,GACA,kBAAAuJ,GAEAC,MAAAD,OAJA,CASArI,EAAAmC,IAAAC,GAAA,0BAAAtD,EAAA,+BAGA,IAAA8U,EAAA3b,SAAAQ,cAAA,OACAmb,EAAA4C,OAAA,WACA,IAAAC,EAAAvY,EAAAkB,gBACAqX,GAAA,oBAAAA,GACAA,EAAA3X,GAGA8U,EAAA,MAEAA,EAAA8C,QAAA,WACA9C,EAAA,KAEAvJ,EAAA8L,OAAA,sCAAArX,EAAA,cAGA8U,EAAA+C,QAAA,WACA/C,EAAA,MAEAA,EAAAlV,IAAAI,KAIA+N,UAAA,SAAA5M,GACA,IAAA2W,EAAAngB,KAEA,GAAAwJ,KAAA9I,OAAA,CAKA,IAAA6I,EAAAvJ,KAAAuJ,OACA9B,EAAA8B,EAAA9B,OACAuP,EAAAvP,EAAAuP,gBACAlO,EAAArB,EAAAqB,oBAEAsX,EAAA3Y,EAAAoB,iBACAwX,EAAAD,EAAA,UACAE,EAAA7Y,EAAA8Y,oBAAA,IACAxX,EAAAtB,EAAAsB,gBAAA,GACAC,EAAAvB,EAAAuB,iBAAA,GACAwX,EAAA/Y,EAAA+Y,uBACAvX,EAAAxB,EAAAwB,kBAAA,GACAwX,EAAAhZ,EAAA2B,gBAAA,GACAQ,EAAAnC,EAAA0B,kBAAA,IACAD,EAAAzB,EAAAyB,gBACA,MAAAA,IACAA,GAAA,GAEA,IAAA+N,EAAAxP,EAAAwP,gBAEA,GAAAA,GAEAD,GAAAlO,EAFA,CAQA,IAAA4X,EAAA,GACAC,EAAA,GAyBA,GAxBAlW,EAAAjB,EAAA,SAAAoX,GACA,IAAApL,EAAAoL,EAAApL,KACAqL,EAAAD,EAAAC,KAGArL,GAAAqL,KAIA,sCAAAzW,KAAAoL,GAKA4K,EAAAS,EAEAF,EAAAnd,KAAA,IAAAgS,EAAA,OAAA6K,EAAA,KAKAK,EAAAld,KAAAod,GAVAD,EAAAnd,KAAA,IAAAgS,EAAA,YAaAmL,EAAAjgB,OACAV,KAAA0f,OAAA,cAAAiB,EAAA7b,KAAA,YAGA,GAAA4b,EAAAhgB,OAAA4f,EACAtgB,KAAA0f,OAAA,SAAAY,EAAA,YAKA,GAAArJ,GAAA,oBAAAA,EACAA,EAAAyJ,EAAA1gB,KAAA8W,cAAAgK,KAAA9gB,WADA,CAQA,IAAA+gB,EAAA,IAAAC,SAOA,GANAvW,EAAAiW,EAAA,SAAAE,GACA,IAAApL,EAAAzM,GAAA6X,EAAApL,KACAuL,EAAAtb,OAAA+P,EAAAoL,KAIA5J,GAAA,kBAAAA,EAAA,CAEA,IAAAiK,EAAAjK,EAAAhT,MAAA,KACAgT,EAAAiK,EAAA,GACA,IAAAC,EAAAD,EAAA,OACA1W,EAAAvB,EAAA,SAAA1E,EAAAC,GAKAic,IACAxJ,EAAAjU,QAAA,OACAiU,GAAA,IAEAA,GAAA,IAEAA,IAAA1S,EAAA,IAAAC,GAIAwc,EAAAtb,OAAAnB,EAAAC,KAEA2c,IACAlK,GAAA,IAAAkK,GAIA,IAAA5X,EAAA,IAAA6X,eAqFA,GApFA7X,EAAA8X,KAAA,OAAApK,GAGA1N,EAAAM,UACAN,EAAA+X,UAAA,WAEAZ,EAAA7W,SAAA,oBAAA6W,EAAA7W,SACA6W,EAAA7W,QAAAN,EAAAC,GAGA4W,EAAAT,OAAA,WAIApW,EAAAgY,SACAhY,EAAAgY,OAAAC,WAAA,SAAArd,GACA,IAAAsd,OAAA,EAEAC,EAAA,IAAAxI,EAAA1P,GACArF,EAAAwd,mBACAF,EAAAtd,EAAAyd,OAAAzd,EAAA0d,MACAH,EAAAnc,KAAAkc,MAMAlY,EAAAuY,mBAAA,WACA,IAAAtf,OAAA,EACA,OAAA+G,EAAAwY,WAAA,CACA,GAAAxY,EAAAyY,OAAA,KAAAzY,EAAAyY,QAAA,IAQA,OANAtB,EAAA9W,OAAA,oBAAA8W,EAAA9W,OACA8W,EAAA9W,MAAAL,EAAAC,QAIA4W,EAAAT,OAAA,gCAAApW,EAAAyY,QAKA,GADAxf,EAAA+G,EAAA0Y,aACA,iCAAAzf,EAAA,YAAA+c,EAAA/c,IACA,IACAA,EAAA0f,KAAAC,MAAA3f,GACyB,MAAA0a,GAOzB,OALAwD,EAAA/W,MAAA,oBAAA+W,EAAA/W,MACA+W,EAAA/W,KAAAJ,EAAAC,EAAAhH,QAGA4d,EAAAT,OAAA,8BAAAnd,GAIA,GAAAke,EAAA0B,cAAA,KAAA5f,EAAA6f,MAQqB,CACrB,GAAA3B,EAAA0B,cAAA,oBAAA1B,EAAA0B,aAEA1B,EAAA0B,aAAAhC,EAAArJ,cAAAgK,KAAAX,GAAA5d,EAAAgH,OACyB,CAEzB,IAAA8Y,EAAA9f,EAAA8f,MAAA,GACAA,EAAAnf,QAAA,SAAAmF,GACA8X,EAAArJ,cAAAzO,KAKAoY,EAAAhX,SAAA,oBAAAgX,EAAAhX,SACAgX,EAAAhX,QAAAH,EAAAC,EAAAhH,QApBAke,EAAA/W,MAAA,oBAAA+W,EAAA/W,MACA+W,EAAA/W,KAAAJ,EAAAC,EAAAhH,GAIA4d,EAAAT,OAAA,kCAAAnd,EAAA6f,SAsBA3B,EAAApX,QAAA,oBAAAoX,EAAApX,OAAA,CACA,IAAAiZ,EAAA7B,EAAApX,OAAAC,EAAAC,EAAAmX,GACA,GAAA4B,GAAA,iCAAAA,EAAA,YAAAhD,EAAAgD,KACAA,EAAAC,QAGA,YADAviB,KAAA0f,OAAA4C,EAAAE,KAkBA,OAXAjY,EAAAtB,EAAA,SAAA3E,EAAAC,GACA+E,EAAAmZ,iBAAAne,EAAAC,KAIA+E,EAAAJ,uBAGAI,EAAAoZ,KAAA3B,GAOAjY,GACA2B,EAAAjB,EAAA,SAAAoX,GACA,IAAArU,EAAA4T,EACAwC,EAAA,IAAAzL,WACAyL,EAAAC,cAAAhC,GACA+B,EAAA5C,OAAA,WACAxT,EAAAuK,cAAA9W,KAAAuC,gBAYA,IAAAsgB,EAAA,EAGA,SAAAC,EAAAC,EAAAC,GACA,SAAAD,EAEA,UAAAjD,MAAA,4BAGA9f,KAAAijB,GAAA,cAAAJ,IAEA7iB,KAAA+iB,kBACA/iB,KAAAgjB,eAGAhjB,KAAAkjB,aAAA,GAIAJ,EAAAjiB,UAAA,CACAoC,YAAA6f,EAGAK,YAAA,WAEA,IAAA/iB,EAAA,GACAJ,KAAAyH,OAAAvH,OAAAC,OAAAC,EAAAqH,EAAAzH,KAAAkjB,cAGA,IAAAE,EAAApjB,KAAAyH,OAAA4b,MAAA,GACAnX,EAAA,GACA3B,EAAA6Y,EAAA,SAAA9e,EAAAC,GAGA2H,EAAA1I,KAAA,CACA2G,IAAA,IAAAmZ,OAAAhf,EAAA,OACAC,UAIAvE,KAAAyH,OAAAyE,YAIAqX,SAAA,WACA,IAAAhX,EAAAvM,KAEA+iB,EAAA/iB,KAAA+iB,gBACAS,EAAAxgB,EAAA+f,GACAC,EAAAhjB,KAAAgjB,aAEAS,EAAAzjB,KAAAyH,OACAS,EAAAub,EAAAvb,OAGA6S,OAAA,EACArL,OAAA,EACAzB,OAAA,EACAvI,OAAA,EAEA,MAAAsd,GAEAjI,EAAA/X,EAAA,eACA0M,EAAA1M,EAAA,eAGA0C,EAAA8d,EAAAthB,WAGAshB,EAAA/d,OAAAsV,GAAAtV,OAAAiK,GAGAqL,EAAA/V,IAAA,8BAAAA,IAAA,2BACA0K,EAAA1K,IAAA,2BAAAA,IAAA,qBAAAA,IAAA,oBAGA+V,EAAAyI,EACA9T,EAAA1M,EAAAggB,GAEAtd,EAAAgK,EAAAxN,YAIA+L,EAAAjL,EAAA,eACAiL,EAAA5J,KAAA,0BAAAW,IAAA,gBAAAA,IAAA,iBAGAU,KAAAhF,OACAuN,EAAAxI,OAAAC,GAEAuI,EAAAxI,OAAAzC,EAAA,gBAIA0M,EAAAjK,OAAAwI,GAGA8M,EAAArW,SAAA,eACAgL,EAAAhL,SAAA,sBACAgL,EAAA1K,IAAA,UAAAkD,GACA+F,EAAAvJ,SAAA,YAGA,IAAAgf,EAAA/Y,EAAA,gBACAoQ,EAAA1W,KAAA,KAAAqf,GACA,IAAAC,EAAAhZ,EAAA,aACAsD,EAAA5J,KAAA,KAAAsf,GAGA3jB,KAAA+a,eACA/a,KAAA0P,qBACA1P,KAAAiO,YACAjO,KAAA0jB,gBACA1jB,KAAA2jB,aAGA,IAAAC,GAAA,EACAlU,EAAA7L,GAAA,8BAEA+f,GAAA,IAEAlU,EAAA7L,GAAA,4BAEA+f,GAAA,IAIAlU,EAAA7L,GAAA,yBAEA+f,GAAArX,EAAAmR,QAAAnR,EAAAmR,WAEA3C,EAAAlX,GAAA,mBACA7D,KAAA0d,QAAA1d,KAAA0d,YAIA+F,EAAAI,SAAAJ,EAAAK,UAEA9jB,KAAA+jB,SAAA,EAEA/gB,EAAAxB,UAAAqC,GAAA,iBAAAK,GAEA,IAAA8f,EAAA/V,EAAAhI,UAAAjD,EAAAkB,EAAA9D,SAGA6jB,EAAAlJ,EAAA9U,UAAAjD,EAAAkB,EAAA9D,SACA8jB,EAAAnJ,EAAA,IAAA7W,EAAA9D,OAEA,GAAA4jB,EAWAzX,EAAAwX,SACAxX,EAAAsX,SAAAtX,EAAAsX,UAEAtX,EAAAwX,SAAA,MAdA,CAEA,GAAAE,IAAAC,EACA,OAGA3X,EAAAwX,SACAxX,EAAAuX,QAAAvX,EAAAuX,SAEAvX,EAAAwX,SAAA,OAYAI,aAAA,WACAnkB,KAAA0L,IAAA,IAAAoN,EAAA9Y,OAIAokB,kBAAA,WACApkB,KAAAuL,UAAA,IAAAwN,EAAA/Y,OAIAqkB,eAAA,WACArkB,KAAAoW,UAAA,IAAAqJ,EAAAzf,OAIAskB,WAAA,WACAtkB,KAAA0H,MAAA,IAAA0P,EAAApX,MACAA,KAAA0H,MAAA+S,QAIA8J,UAAA,WACAvkB,KAAAgY,IAAA,IAAAa,EAAA7Y,MACAA,KAAAgY,IAAAyC,QAIAU,cAAA,SAAAqJ,GACA,IAAAvW,EAAAjO,KAAAiO,UACAvI,EAAAuI,EAAA/L,WACA,IAAAwD,EAAAhF,OAIA,OAFAuN,EAAAxI,OAAAzC,EAAA,qBACAhD,KAAAmb,gBAIA,IAAAsJ,EAAA/e,EAAA9B,OAEA,GAAA4gB,EAAA,CAEA,IAAA1iB,EAAA2iB,EAAA3iB,OAAA2T,cACAlP,EAAAke,EAAAne,cACA,YAAAxE,GAAA,UAAAA,GAAA,MAAAyE,EAIA,OAFA0H,EAAAxI,OAAAzC,EAAA,qBACAhD,KAAAmb,gBAKAnb,KAAAuL,UAAAuF,kBAAA2T,GAAA,MACAzkB,KAAAuL,UAAAM,oBAIAiP,WAAA,WAEA,IAAA4J,EAAA,EACAC,EAAA3kB,KAAAgY,IAAAlW,OACA2hB,EAAAzjB,KAAAyH,OAGAmd,EAAAnB,EAAAmB,gBACAA,EAAApR,SAAAoR,EAAA,MACAA,MAAA,KACAA,EAAA,KAGA,IAAAC,EAAApB,EAAAoB,SACAA,GAAA,oBAAAA,IAKA7kB,KAAA0d,OAAA,WAEA,IAAAoH,EAAA9kB,KAAAgY,IAAAlW,OAEAgjB,EAAApkB,SAAAikB,EAAAjkB,QAEAokB,IAAAH,IAMAD,GACAhX,aAAAgX,GAEAA,EAAA1X,WAAA,WAEA6X,EAAAC,GACAH,EAAAG,GACiBF,MAKjB,IAAAd,EAAAL,EAAAK,OACAA,GAAA,oBAAAA,IACA9jB,KAAA8jB,OAAA,WACA,IAAAgB,EAAA9kB,KAAAgY,IAAAlW,OACAgiB,EAAAgB,KAKA,IAAAjB,EAAAJ,EAAAI,QACAA,GAAA,oBAAAA,IACA7jB,KAAA6jB,QAAA,WACAA,OAMAkB,OAAA,WAEA/kB,KAAAmjB,cAGAnjB,KAAAujB,WAGAvjB,KAAAmkB,eAGAnkB,KAAAokB,oBAGApkB,KAAAukB,YAGAvkB,KAAAskB,aAGAtkB,KAAAqkB,iBAGArkB,KAAAmb,eAAA,GAGAnb,KAAA8a,cAIAkK,aAAA,WACAhiB,EAAAwE,WAYAvH,IAGA,IAAAglB,GAAA,68gBAGA/f,GAAA1D,SAAAQ,cAAA,SACAkD,GAAApB,KAAA,WACAoB,GAAAjD,UAAAgjB,GACAzjB,SAAA0jB,qBAAA,QAAAtjB,KAAA,GAAAgE,YAAAV,IAGA,IAAA1E,GAAA8J,OAAA6a,YAAArC,EAEA,OAAAtiB","file":"static/js/chunk-2d0b5978.35930825.js","sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.wangEditor = factory());\n}(this, (function () { 'use strict';\n\n/*\n poly-fill\n*/\n\nvar polyfill = function () {\n\n // Object.assign\n if (typeof Object.assign != 'function') {\n Object.assign = function (target, varArgs) {\n // .length of function is 2\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var to = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var nextSource = arguments[index];\n\n if (nextSource != null) {\n // Skip over if undefined or null\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n\n // IE 中兼容 Element.prototype.matches\n if (!Element.prototype.matches) {\n Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n i = matches.length;\n while (--i >= 0 && matches.item(i) !== this) {}\n return i > -1;\n };\n }\n};\n\n/*\n DOM 操作 API\n*/\n\n// 根据 html 代码片段创建 dom 对象\nfunction createElemByHTML(html) {\n var div = void 0;\n div = document.createElement('div');\n div.innerHTML = html;\n return div.children;\n}\n\n// 是否是 DOM List\nfunction isDOMList(selector) {\n if (!selector) {\n return false;\n }\n if (selector instanceof HTMLCollection || selector instanceof NodeList) {\n return true;\n }\n return false;\n}\n\n// 封装 document.querySelectorAll\nfunction querySelectorAll(selector) {\n var result = document.querySelectorAll(selector);\n if (isDOMList(result)) {\n return result;\n } else {\n return [result];\n }\n}\n\n// 记录所有的事件绑定\nvar eventList = [];\n\n// 创建构造函数\nfunction DomElement(selector) {\n if (!selector) {\n return;\n }\n\n // selector 本来就是 DomElement 对象,直接返回\n if (selector instanceof DomElement) {\n return selector;\n }\n\n this.selector = selector;\n var nodeType = selector.nodeType;\n\n // 根据 selector 得出的结果(如 DOM,DOM List)\n var selectorResult = [];\n if (nodeType === 9) {\n // document 节点\n selectorResult = [selector];\n } else if (nodeType === 1) {\n // 单个 DOM 节点\n selectorResult = [selector];\n } else if (isDOMList(selector) || selector instanceof Array) {\n // DOM List 或者数组\n selectorResult = selector;\n } else if (typeof selector === 'string') {\n // 字符串\n selector = selector.replace('/\\n/mg', '').trim();\n if (selector.indexOf('<') === 0) {\n // 如
\n selectorResult = createElemByHTML(selector);\n } else {\n // 如 #id .class\n selectorResult = querySelectorAll(selector);\n }\n }\n\n var length = selectorResult.length;\n if (!length) {\n // 空数组\n return this;\n }\n\n // 加入 DOM 节点\n var i = void 0;\n for (i = 0; i < length; i++) {\n this[i] = selectorResult[i];\n }\n this.length = length;\n}\n\n// 修改原型\nDomElement.prototype = {\n constructor: DomElement,\n\n // 类数组,forEach\n forEach: function forEach(fn) {\n var i = void 0;\n for (i = 0; i < this.length; i++) {\n var elem = this[i];\n var result = fn.call(elem, elem, i);\n if (result === false) {\n break;\n }\n }\n return this;\n },\n\n // clone\n clone: function clone(deep) {\n var cloneList = [];\n this.forEach(function (elem) {\n cloneList.push(elem.cloneNode(!!deep));\n });\n return $(cloneList);\n },\n\n // 获取第几个元素\n get: function get(index) {\n var length = this.length;\n if (index >= length) {\n index = index % length;\n }\n return $(this[index]);\n },\n\n // 第一个\n first: function first() {\n return this.get(0);\n },\n\n // 最后一个\n last: function last() {\n var length = this.length;\n return this.get(length - 1);\n },\n\n // 绑定事件\n on: function on(type, selector, fn) {\n // selector 不为空,证明绑定事件要加代理\n if (!fn) {\n fn = selector;\n selector = null;\n }\n\n // type 是否有多个\n var types = [];\n types = type.split(/\\s+/);\n\n return this.forEach(function (elem) {\n types.forEach(function (type) {\n if (!type) {\n return;\n }\n\n // 记录下,方便后面解绑\n eventList.push({\n elem: elem,\n type: type,\n fn: fn\n });\n\n if (!selector) {\n // 无代理\n elem.addEventListener(type, fn);\n return;\n }\n\n // 有代理\n elem.addEventListener(type, function (e) {\n var target = e.target;\n if (target.matches(selector)) {\n fn.call(target, e);\n }\n });\n });\n });\n },\n\n // 取消事件绑定\n off: function off(type, fn) {\n return this.forEach(function (elem) {\n elem.removeEventListener(type, fn);\n });\n },\n\n // 获取/设置 属性\n attr: function attr(key, val) {\n if (val == null) {\n // 获取值\n return this[0].getAttribute(key);\n } else {\n // 设置值\n return this.forEach(function (elem) {\n elem.setAttribute(key, val);\n });\n }\n },\n\n // 添加 class\n addClass: function addClass(className) {\n if (!className) {\n return this;\n }\n return this.forEach(function (elem) {\n var arr = void 0;\n if (elem.className) {\n // 解析当前 className 转换为数组\n arr = elem.className.split(/\\s/);\n arr = arr.filter(function (item) {\n return !!item.trim();\n });\n // 添加 class\n if (arr.indexOf(className) < 0) {\n arr.push(className);\n }\n // 修改 elem.class\n elem.className = arr.join(' ');\n } else {\n elem.className = className;\n }\n });\n },\n\n // 删除 class\n removeClass: function removeClass(className) {\n if (!className) {\n return this;\n }\n return this.forEach(function (elem) {\n var arr = void 0;\n if (elem.className) {\n // 解析当前 className 转换为数组\n arr = elem.className.split(/\\s/);\n arr = arr.filter(function (item) {\n item = item.trim();\n // 删除 class\n if (!item || item === className) {\n return false;\n }\n return true;\n });\n // 修改 elem.class\n elem.className = arr.join(' ');\n }\n });\n },\n\n // 修改 css\n css: function css(key, val) {\n var currentStyle = key + ':' + val + ';';\n return this.forEach(function (elem) {\n var style = (elem.getAttribute('style') || '').trim();\n var styleArr = void 0,\n resultArr = [];\n if (style) {\n // 将 style 按照 ; 拆分为数组\n styleArr = style.split(';');\n styleArr.forEach(function (item) {\n // 对每项样式,按照 : 拆分为 key 和 value\n var arr = item.split(':').map(function (i) {\n return i.trim();\n });\n if (arr.length === 2) {\n resultArr.push(arr[0] + ':' + arr[1]);\n }\n });\n // 替换或者新增\n resultArr = resultArr.map(function (item) {\n if (item.indexOf(key) === 0) {\n return currentStyle;\n } else {\n return item;\n }\n });\n if (resultArr.indexOf(currentStyle) < 0) {\n resultArr.push(currentStyle);\n }\n // 结果\n elem.setAttribute('style', resultArr.join('; '));\n } else {\n // style 无值\n elem.setAttribute('style', currentStyle);\n }\n });\n },\n\n // 显示\n show: function show() {\n return this.css('display', 'block');\n },\n\n // 隐藏\n hide: function hide() {\n return this.css('display', 'none');\n },\n\n // 获取子节点\n children: function children() {\n var elem = this[0];\n if (!elem) {\n return null;\n }\n\n return $(elem.children);\n },\n\n // 获取子节点(包括文本节点)\n childNodes: function childNodes() {\n var elem = this[0];\n if (!elem) {\n return null;\n }\n\n return $(elem.childNodes);\n },\n\n // 增加子节点\n append: function append($children) {\n return this.forEach(function (elem) {\n $children.forEach(function (child) {\n elem.appendChild(child);\n });\n });\n },\n\n // 移除当前节点\n remove: function remove() {\n return this.forEach(function (elem) {\n if (elem.remove) {\n elem.remove();\n } else {\n var parent = elem.parentElement;\n parent && parent.removeChild(elem);\n }\n });\n },\n\n // 是否包含某个子节点\n isContain: function isContain($child) {\n var elem = this[0];\n var child = $child[0];\n return elem.contains(child);\n },\n\n // 尺寸数据\n getSizeData: function getSizeData() {\n var elem = this[0];\n return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据\n },\n\n // 封装 nodeName\n getNodeName: function getNodeName() {\n var elem = this[0];\n return elem.nodeName;\n },\n\n // 从当前元素查找\n find: function find(selector) {\n var elem = this[0];\n return $(elem.querySelectorAll(selector));\n },\n\n // 获取当前元素的 text\n text: function text(val) {\n if (!val) {\n // 获取 text\n var elem = this[0];\n return elem.innerHTML.replace(/<.*?>/g, function () {\n return '';\n });\n } else {\n // 设置 text\n return this.forEach(function (elem) {\n elem.innerHTML = val;\n });\n }\n },\n\n // 获取 html\n html: function html(value) {\n var elem = this[0];\n if (value == null) {\n return elem.innerHTML;\n } else {\n elem.innerHTML = value;\n return this;\n }\n },\n\n // 获取 value\n val: function val() {\n var elem = this[0];\n return elem.value.trim();\n },\n\n // focus\n focus: function focus() {\n return this.forEach(function (elem) {\n elem.focus();\n });\n },\n\n // parent\n parent: function parent() {\n var elem = this[0];\n return $(elem.parentElement);\n },\n\n // parentUntil 找到符合 selector 的父节点\n parentUntil: function parentUntil(selector, _currentElem) {\n var results = document.querySelectorAll(selector);\n var length = results.length;\n if (!length) {\n // 传入的 selector 无效\n return null;\n }\n\n var elem = _currentElem || this[0];\n if (elem.nodeName === 'BODY') {\n return null;\n }\n\n var parent = elem.parentElement;\n var i = void 0;\n for (i = 0; i < length; i++) {\n if (parent === results[i]) {\n // 找到,并返回\n return $(parent);\n }\n }\n\n // 继续查找\n return this.parentUntil(selector, parent);\n },\n\n // 判断两个 elem 是否相等\n equal: function equal($elem) {\n if ($elem.nodeType === 1) {\n return this[0] === $elem;\n } else {\n return this[0] === $elem[0];\n }\n },\n\n // 将该元素插入到某个元素前面\n insertBefore: function insertBefore(selector) {\n var $referenceNode = $(selector);\n var referenceNode = $referenceNode[0];\n if (!referenceNode) {\n return this;\n }\n return this.forEach(function (elem) {\n var parent = referenceNode.parentNode;\n parent.insertBefore(elem, referenceNode);\n });\n },\n\n // 将该元素插入到某个元素后面\n insertAfter: function insertAfter(selector) {\n var $referenceNode = $(selector);\n var referenceNode = $referenceNode[0];\n if (!referenceNode) {\n return this;\n }\n return this.forEach(function (elem) {\n var parent = referenceNode.parentNode;\n if (parent.lastChild === referenceNode) {\n // 最后一个元素\n parent.appendChild(elem);\n } else {\n // 不是最后一个元素\n parent.insertBefore(elem, referenceNode.nextSibling);\n }\n });\n }\n};\n\n// new 一个对象\nfunction $(selector) {\n return new DomElement(selector);\n}\n\n// 解绑所有事件,用于销毁编辑器\n$.offAll = function () {\n eventList.forEach(function (item) {\n var elem = item.elem;\n var type = item.type;\n var fn = item.fn;\n // 解绑\n elem.removeEventListener(type, fn);\n });\n};\n\n/*\n 配置信息\n*/\n\nvar config = {\n\n // 默认菜单配置\n menus: ['head', 'bold', 'fontSize', 'fontName', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'],\n\n fontNames: ['宋体', '微软雅黑', 'Arial', 'Tahoma', 'Verdana'],\n\n colors: ['#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff'],\n\n // // 语言配置\n // lang: {\n // '设置标题': 'title',\n // '正文': 'p',\n // '链接文字': 'link text',\n // '链接': 'link',\n // '插入': 'insert',\n // '创建': 'init'\n // },\n\n // 表情\n emotions: [{\n // tab 的标题\n title: '默认',\n // type -> 'emoji' / 'image'\n type: 'image',\n // content -> 数组\n content: [{\n alt: '[坏笑]',\n src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'\n }, {\n alt: '[舔屏]',\n src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'\n }, {\n alt: '[污]',\n src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'\n }]\n }, {\n // tab 的标题\n title: '新浪',\n // type -> 'emoji' / 'image'\n type: 'image',\n // content -> 数组\n content: [{\n src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',\n alt: '[草泥马]'\n }, {\n src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',\n alt: '[神马]'\n }, {\n src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',\n alt: '[浮云]'\n }]\n }, {\n // tab 的标题\n title: 'emoji',\n // type -> 'emoji' / 'image'\n type: 'emoji',\n // content -> 数组\n content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\\s/)\n }],\n\n // 编辑区域的 z-index\n zIndex: 10000,\n\n // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出)\n debug: false,\n\n // 插入链接时候的格式校验\n linkCheck: function linkCheck(text, link) {\n // text 是插入的文字\n // link 是插入的链接\n return true; // 返回 true 即表示成功\n // return '校验失败' // 返回字符串即表示失败的提示信息\n },\n\n // 插入网络图片的校验\n linkImgCheck: function linkImgCheck(src) {\n // src 即图片的地址\n return true; // 返回 true 即表示成功\n // return '校验失败' // 返回字符串即表示失败的提示信息\n },\n\n // 粘贴过滤样式,默认开启\n pasteFilterStyle: true,\n\n // 粘贴内容时,忽略图片。默认关闭\n pasteIgnoreImg: false,\n\n // 对粘贴的文字进行自定义处理,返回处理后的结果。编辑器会将处理后的结果粘贴到编辑区域中。\n // IE 暂时不支持\n pasteTextHandle: function pasteTextHandle(content) {\n // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回\n return content;\n },\n\n // onchange 事件\n // onchange: function (html) {\n // // html 即变化之后的内容\n // console.log(html)\n // },\n\n // 是否显示添加网络图片的 tab\n showLinkImg: true,\n\n // 插入网络图片的回调\n linkImgCallback: function linkImgCallback(url) {\n // console.log(url) // url 即插入图片的地址\n },\n\n // 默认上传图片 max size: 5M\n uploadImgMaxSize: 5 * 1024 * 1024,\n\n // 配置一次最多上传几个图片\n // uploadImgMaxLength: 5,\n\n // 上传图片,是否显示 base64 格式\n uploadImgShowBase64: false,\n\n // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效)\n // uploadImgServer: '/upload',\n\n // 自定义配置 filename\n uploadFileName: '',\n\n // 上传图片的自定义参数\n uploadImgParams: {\n // token: 'abcdef12345'\n },\n\n // 上传图片的自定义header\n uploadImgHeaders: {\n // 'Accept': 'text/x-json'\n },\n\n // 配置 XHR withCredentials\n withCredentials: false,\n\n // 自定义上传图片超时时间 ms\n uploadImgTimeout: 10000,\n\n // 上传图片 hook \n uploadImgHooks: {\n // customInsert: function (insertLinkImg, result, editor) {\n // console.log('customInsert')\n // // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片\n // const data = result.data1 || []\n // data.forEach(link => {\n // insertLinkImg(link)\n // })\n // },\n before: function before(xhr, editor, files) {\n // 图片上传之前触发\n\n // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传\n // return {\n // prevent: true,\n // msg: '放弃上传'\n // }\n },\n success: function success(xhr, editor, result) {\n // 图片上传并返回结果,图片插入成功之后触发\n },\n fail: function fail(xhr, editor, result) {\n // 图片上传并返回结果,但图片插入错误时触发\n },\n error: function error(xhr, editor) {\n // 图片上传出错时触发\n },\n timeout: function timeout(xhr, editor) {\n // 图片上传超时时触发\n }\n },\n\n // 是否上传七牛云,默认为 false\n qiniu: false\n\n};\n\n/*\n 工具\n*/\n\n// 和 UA 相关的属性\nvar UA = {\n _ua: navigator.userAgent,\n\n // 是否 webkit\n isWebkit: function isWebkit() {\n var reg = /webkit/i;\n return reg.test(this._ua);\n },\n\n // 是否 IE\n isIE: function isIE() {\n return 'ActiveXObject' in window;\n }\n};\n\n// 遍历对象\nfunction objForEach(obj, fn) {\n var key = void 0,\n result = void 0;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n result = fn.call(obj, key, obj[key]);\n if (result === false) {\n break;\n }\n }\n }\n}\n\n// 遍历类数组\nfunction arrForEach(fakeArr, fn) {\n var i = void 0,\n item = void 0,\n result = void 0;\n var length = fakeArr.length || 0;\n for (i = 0; i < length; i++) {\n item = fakeArr[i];\n result = fn.call(fakeArr, item, i);\n if (result === false) {\n break;\n }\n }\n}\n\n// 获取随机数\nfunction getRandom(prefix) {\n return prefix + Math.random().toString().slice(2);\n}\n\n// 替换 html 特殊字符\nfunction replaceHtmlSymbol(html) {\n if (html == null) {\n return '';\n }\n return html.replace(//gm, '>').replace(/\"/gm, '"').replace(/(\\r\\n|\\r|\\n)/g, '
');\n}\n\n// 返回百分比的格式\n\n\n// 判断是不是 function\nfunction isFunction(fn) {\n return typeof fn === 'function';\n}\n\n/*\n bold-menu\n*/\n// 构造函数\nfunction Bold(editor) {\n this.editor = editor;\n this.$elem = $('
\\n \\n
');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nBold.prototype = {\n constructor: Bold,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n if (isSeleEmpty) {\n // 选区是空的,插入并选中一个“空白”\n editor.selection.createEmptyRange();\n }\n\n // 执行 bold 命令\n editor.cmd.do('bold');\n\n if (isSeleEmpty) {\n // 需要将选取折叠起来\n editor.selection.collapseRange();\n editor.selection.restoreSelection();\n }\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor.cmd.queryCommandState('bold')) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n 替换多语言\n */\n\nvar replaceLang = function (editor, str) {\n var langArgs = editor.config.langArgs || [];\n var result = str;\n\n langArgs.forEach(function (item) {\n var reg = item.reg;\n var val = item.val;\n\n if (reg.test(result)) {\n result = result.replace(reg, function () {\n return val;\n });\n }\n });\n\n return result;\n};\n\n/*\n droplist\n*/\nvar _emptyFn = function _emptyFn() {};\n\n// 构造函数\nfunction DropList(menu, opt) {\n var _this = this;\n\n // droplist 所依附的菜单\n var editor = menu.editor;\n this.menu = menu;\n this.opt = opt;\n // 容器\n var $container = $('
');\n\n // 标题\n var $title = opt.$title;\n var titleHtml = void 0;\n if ($title) {\n // 替换多语言\n titleHtml = $title.html();\n titleHtml = replaceLang(editor, titleHtml);\n $title.html(titleHtml);\n\n $title.addClass('w-e-dp-title');\n $container.append($title);\n }\n\n var list = opt.list || [];\n var type = opt.type || 'list'; // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单)\n var onClick = opt.onClick || _emptyFn;\n\n // 加入 DOM 并绑定事件\n var $list = $('');\n $container.append($list);\n list.forEach(function (item) {\n var $elem = item.$elem;\n\n // 替换多语言\n var elemHtml = $elem.html();\n elemHtml = replaceLang(editor, elemHtml);\n $elem.html(elemHtml);\n\n var value = item.value;\n var $li = $('
  • ');\n if ($elem) {\n $li.append($elem);\n $list.append($li);\n $li.on('click', function (e) {\n onClick(value);\n\n // 隐藏\n _this.hideTimeoutId = setTimeout(function () {\n _this.hide();\n }, 0);\n });\n }\n });\n\n // 绑定隐藏事件\n $container.on('mouseleave', function (e) {\n _this.hideTimeoutId = setTimeout(function () {\n _this.hide();\n }, 0);\n });\n\n // 记录属性\n this.$container = $container;\n\n // 基本属性\n this._rendered = false;\n this._show = false;\n}\n\n// 原型\nDropList.prototype = {\n constructor: DropList,\n\n // 显示(插入DOM)\n show: function show() {\n if (this.hideTimeoutId) {\n // 清除之前的定时隐藏\n clearTimeout(this.hideTimeoutId);\n }\n\n var menu = this.menu;\n var $menuELem = menu.$elem;\n var $container = this.$container;\n if (this._show) {\n return;\n }\n if (this._rendered) {\n // 显示\n $container.show();\n } else {\n // 加入 DOM 之前先定位位置\n var menuHeight = $menuELem.getSizeData().height || 0;\n var width = this.opt.width || 100; // 默认为 100\n $container.css('margin-top', menuHeight + 'px').css('width', width + 'px');\n\n // 加入到 DOM\n $menuELem.append($container);\n this._rendered = true;\n }\n\n // 修改属性\n this._show = true;\n },\n\n // 隐藏(移除DOM)\n hide: function hide() {\n if (this.showTimeoutId) {\n // 清除之前的定时显示\n clearTimeout(this.showTimeoutId);\n }\n\n var $container = this.$container;\n if (!this._show) {\n return;\n }\n // 隐藏并需改属性\n $container.hide();\n this._show = false;\n }\n};\n\n/*\n menu - header\n*/\n// 构造函数\nfunction Head(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 100,\n $title: $('

    设置标题

    '),\n type: 'list', // droplist 以列表形式展示\n list: [{ $elem: $('

    H1

    '), value: '

    ' }, { $elem: $('

    H2

    '), value: '

    ' }, { $elem: $('

    H3

    '), value: '

    ' }, { $elem: $('

    H4

    '), value: '

    ' }, { $elem: $('

    H5
    '), value: '
    ' }, { $elem: $('

    正文

    '), value: '

    ' }],\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 Head 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nHead.prototype = {\n constructor: Head,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if (editor.$textElem.equal($selectionElem)) {\n // 不能选中多行来设置标题,否则会出现问题\n // 例如选中的是

    xxx

    yyy

    来设置标题,设置之后会成为

    xxx
    yyy

    不符合预期\n return;\n }\n\n editor.cmd.do('formatBlock', value);\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n var reg = /^h/i;\n var cmdValue = editor.cmd.queryCommandValue('formatBlock');\n if (reg.test(cmdValue)) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n menu - fontSize\n*/\n\n// 构造函数\nfunction FontSize(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 160,\n $title: $('

    字号

    '),\n type: 'list', // droplist 以列表形式展示\n list: [{ $elem: $('x-small'), value: '1' }, { $elem: $('small'), value: '2' }, { $elem: $('normal'), value: '3' }, { $elem: $('large'), value: '4' }, { $elem: $('x-large'), value: '5' }, { $elem: $('xx-large'), value: '6' }],\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 FontSize 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nFontSize.prototype = {\n constructor: FontSize,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n editor.cmd.do('fontSize', value);\n }\n};\n\n/*\n menu - fontName\n*/\n\n// 构造函数\nfunction FontName(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 当前是否 active 状态\n this._active = false;\n\n // 获取配置的字体\n var config = editor.config;\n var fontNames = config.fontNames || [];\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 100,\n $title: $('

    字体

    '),\n type: 'list', // droplist 以列表形式展示\n list: fontNames.map(function (fontName) {\n return { $elem: $('' + fontName + ''), value: fontName };\n }),\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 FontName 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nFontName.prototype = {\n constructor: FontName,\n\n _command: function _command(value) {\n var editor = this.editor;\n editor.cmd.do('fontName', value);\n }\n};\n\n/*\n panel\n*/\n\nvar emptyFn = function emptyFn() {};\n\n// 记录已经显示 panel 的菜单\nvar _isCreatedPanelMenus = [];\n\n// 构造函数\nfunction Panel(menu, opt) {\n this.menu = menu;\n this.opt = opt;\n}\n\n// 原型\nPanel.prototype = {\n constructor: Panel,\n\n // 显示(插入DOM)\n show: function show() {\n var _this = this;\n\n var menu = this.menu;\n if (_isCreatedPanelMenus.indexOf(menu) >= 0) {\n // 该菜单已经创建了 panel 不能再创建\n return;\n }\n\n var editor = menu.editor;\n var $body = $('body');\n var $textContainerElem = editor.$textContainerElem;\n var opt = this.opt;\n\n // panel 的容器\n var $container = $('
    ');\n var width = opt.width || 300; // 默认 300px\n $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px');\n\n // 添加关闭按钮\n var $closeBtn = $('');\n $container.append($closeBtn);\n $closeBtn.on('click', function () {\n _this.hide();\n });\n\n // 准备 tabs 容器\n var $tabTitleContainer = $('');\n var $tabContentContainer = $('
    ');\n $container.append($tabTitleContainer).append($tabContentContainer);\n\n // 设置高度\n var height = opt.height;\n if (height) {\n $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto');\n }\n\n // tabs\n var tabs = opt.tabs || [];\n var tabTitleArr = [];\n var tabContentArr = [];\n tabs.forEach(function (tab, tabIndex) {\n if (!tab) {\n return;\n }\n var title = tab.title || '';\n var tpl = tab.tpl || '';\n\n // 替换多语言\n title = replaceLang(editor, title);\n tpl = replaceLang(editor, tpl);\n\n // 添加到 DOM\n var $title = $('
  • ' + title + '
  • ');\n $tabTitleContainer.append($title);\n var $content = $(tpl);\n $tabContentContainer.append($content);\n\n // 记录到内存\n $title._index = tabIndex;\n tabTitleArr.push($title);\n tabContentArr.push($content);\n\n // 设置 active 项\n if (tabIndex === 0) {\n $title._active = true;\n $title.addClass('w-e-active');\n } else {\n $content.hide();\n }\n\n // 绑定 tab 的事件\n $title.on('click', function (e) {\n if ($title._active) {\n return;\n }\n // 隐藏所有的 tab\n tabTitleArr.forEach(function ($title) {\n $title._active = false;\n $title.removeClass('w-e-active');\n });\n tabContentArr.forEach(function ($content) {\n $content.hide();\n });\n\n // 显示当前的 tab\n $title._active = true;\n $title.addClass('w-e-active');\n $content.show();\n });\n });\n\n // 绑定关闭事件\n $container.on('click', function (e) {\n // 点击时阻止冒泡\n e.stopPropagation();\n });\n $body.on('click', function (e) {\n _this.hide();\n });\n\n // 添加到 DOM\n $textContainerElem.append($container);\n\n // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功\n tabs.forEach(function (tab, index) {\n if (!tab) {\n return;\n }\n var events = tab.events || [];\n events.forEach(function (event) {\n var selector = event.selector;\n var type = event.type;\n var fn = event.fn || emptyFn;\n var $content = tabContentArr[index];\n $content.find(selector).on(type, function (e) {\n e.stopPropagation();\n var needToHide = fn(e);\n // 执行完事件之后,是否要关闭 panel\n if (needToHide) {\n _this.hide();\n }\n });\n });\n });\n\n // focus 第一个 elem\n var $inputs = $container.find('input[type=text],textarea');\n if ($inputs.length) {\n $inputs.get(0).focus();\n }\n\n // 添加到属性\n this.$container = $container;\n\n // 隐藏其他 panel\n this._hideOtherPanels();\n // 记录该 menu 已经创建了 panel\n _isCreatedPanelMenus.push(menu);\n },\n\n // 隐藏(移除DOM)\n hide: function hide() {\n var menu = this.menu;\n var $container = this.$container;\n if ($container) {\n $container.remove();\n }\n\n // 将该 menu 记录中移除\n _isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) {\n if (item === menu) {\n return false;\n } else {\n return true;\n }\n });\n },\n\n // 一个 panel 展示时,隐藏其他 panel\n _hideOtherPanels: function _hideOtherPanels() {\n if (!_isCreatedPanelMenus.length) {\n return;\n }\n _isCreatedPanelMenus.forEach(function (menu) {\n var panel = menu.panel || {};\n if (panel.hide) {\n panel.hide();\n }\n });\n }\n};\n\n/*\n menu - link\n*/\n// 构造函数\nfunction Link(editor) {\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nLink.prototype = {\n constructor: Link,\n\n // 点击事件\n onClick: function onClick(e) {\n var editor = this.editor;\n var $linkelem = void 0;\n\n if (this._active) {\n // 当前选区在链接里面\n $linkelem = editor.selection.getSelectionContainerElem();\n if (!$linkelem) {\n return;\n }\n // 将该元素都包含在选取之内,以便后面整体替换\n editor.selection.createRangeByElem($linkelem);\n editor.selection.restoreSelection();\n // 显示 panel\n this._createPanel($linkelem.text(), $linkelem.attr('href'));\n } else {\n // 当前选区不在链接里面\n if (editor.selection.isSelectionEmpty()) {\n // 选区是空的,未选中内容\n this._createPanel('', '');\n } else {\n // 选中内容了\n this._createPanel(editor.selection.getSelectionText(), '');\n }\n }\n },\n\n // 创建 panel\n _createPanel: function _createPanel(text, link) {\n var _this = this;\n\n // panel 中需要用到的id\n var inputLinkId = getRandom('input-link');\n var inputTextId = getRandom('input-text');\n var btnOkId = getRandom('btn-ok');\n var btnDelId = getRandom('btn-del');\n\n // 是否显示“删除链接”\n var delBtnDisplay = this._active ? 'inline-block' : 'none';\n\n // 初始化并显示 panel\n var panel = new Panel(this, {\n width: 300,\n // panel 中可包含多个 tab\n tabs: [{\n // tab 的标题\n title: '链接',\n // 模板\n tpl: '
    \\n \\n \\n
    \\n \\n \\n
    \\n
    ',\n // 事件绑定\n events: [\n // 插入链接\n {\n selector: '#' + btnOkId,\n type: 'click',\n fn: function fn() {\n // 执行插入链接\n var $link = $('#' + inputLinkId);\n var $text = $('#' + inputTextId);\n var link = $link.val();\n var text = $text.val();\n _this._insertLink(text, link);\n\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n },\n // 删除链接\n {\n selector: '#' + btnDelId,\n type: 'click',\n fn: function fn() {\n // 执行删除链接\n _this._delLink();\n\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n } // tab end\n ] // tabs end\n });\n\n // 显示 panel\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 删除当前链接\n _delLink: function _delLink() {\n if (!this._active) {\n return;\n }\n var editor = this.editor;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n var selectionText = editor.selection.getSelectionText();\n editor.cmd.do('insertHTML', '' + selectionText + '');\n },\n\n // 插入链接\n _insertLink: function _insertLink(text, link) {\n var editor = this.editor;\n var config = editor.config;\n var linkCheck = config.linkCheck;\n var checkResult = true; // 默认为 true\n if (linkCheck && typeof linkCheck === 'function') {\n checkResult = linkCheck(text, link);\n }\n if (checkResult === true) {\n editor.cmd.do('insertHTML', '' + text + '');\n } else {\n alert(checkResult);\n }\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n if ($selectionELem.getNodeName() === 'A') {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n italic-menu\n*/\n// 构造函数\nfunction Italic(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nItalic.prototype = {\n constructor: Italic,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n if (isSeleEmpty) {\n // 选区是空的,插入并选中一个“空白”\n editor.selection.createEmptyRange();\n }\n\n // 执行 italic 命令\n editor.cmd.do('italic');\n\n if (isSeleEmpty) {\n // 需要将选取折叠起来\n editor.selection.collapseRange();\n editor.selection.restoreSelection();\n }\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor.cmd.queryCommandState('italic')) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n redo-menu\n*/\n// 构造函数\nfunction Redo(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nRedo.prototype = {\n constructor: Redo,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n\n // 执行 redo 命令\n editor.cmd.do('redo');\n }\n};\n\n/*\n strikeThrough-menu\n*/\n// 构造函数\nfunction StrikeThrough(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nStrikeThrough.prototype = {\n constructor: StrikeThrough,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n if (isSeleEmpty) {\n // 选区是空的,插入并选中一个“空白”\n editor.selection.createEmptyRange();\n }\n\n // 执行 strikeThrough 命令\n editor.cmd.do('strikeThrough');\n\n if (isSeleEmpty) {\n // 需要将选取折叠起来\n editor.selection.collapseRange();\n editor.selection.restoreSelection();\n }\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor.cmd.queryCommandState('strikeThrough')) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n underline-menu\n*/\n// 构造函数\nfunction Underline(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nUnderline.prototype = {\n constructor: Underline,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n if (isSeleEmpty) {\n // 选区是空的,插入并选中一个“空白”\n editor.selection.createEmptyRange();\n }\n\n // 执行 underline 命令\n editor.cmd.do('underline');\n\n if (isSeleEmpty) {\n // 需要将选取折叠起来\n editor.selection.collapseRange();\n editor.selection.restoreSelection();\n }\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor.cmd.queryCommandState('underline')) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n undo-menu\n*/\n// 构造函数\nfunction Undo(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nUndo.prototype = {\n constructor: Undo,\n\n // 点击事件\n onClick: function onClick(e) {\n // 点击菜单将触发这里\n\n var editor = this.editor;\n\n // 执行 undo 命令\n editor.cmd.do('undo');\n }\n};\n\n/*\n menu - list\n*/\n// 构造函数\nfunction List(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 120,\n $title: $('

    设置列表

    '),\n type: 'list', // droplist 以列表形式展示\n list: [{ $elem: $(' 有序列表'), value: 'insertOrderedList' }, { $elem: $(' 无序列表'), value: 'insertUnorderedList' }],\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 List 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nList.prototype = {\n constructor: List,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n editor.selection.restoreSelection();\n if (editor.cmd.queryCommandState(value)) {\n return;\n }\n editor.cmd.do(value);\n\n // 验证列表是否被包裹在

    之内\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if ($selectionElem.getNodeName() === 'LI') {\n $selectionElem = $selectionElem.parent();\n }\n if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {\n return;\n }\n if ($selectionElem.equal($textElem)) {\n // 证明是顶级标签,没有被

    包裹\n return;\n }\n var $parent = $selectionElem.parent();\n if ($parent.equal($textElem)) {\n // $parent 是顶级标签,不能删除\n return;\n }\n\n $selectionElem.insertAfter($parent);\n $parent.remove();\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n menu - justify\n*/\n// 构造函数\nfunction Justify(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('

    ');\n this.type = 'droplist';\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 100,\n $title: $('

    对齐方式

    '),\n type: 'list', // droplist 以列表形式展示\n list: [{ $elem: $(' 靠左'), value: 'justifyLeft' }, { $elem: $(' 居中'), value: 'justifyCenter' }, { $elem: $(' 靠右'), value: 'justifyRight' }],\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 List 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nJustify.prototype = {\n constructor: Justify,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n editor.cmd.do(value);\n }\n};\n\n/*\n menu - Forecolor\n*/\n// 构造函数\nfunction ForeColor(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 获取配置的颜色\n var config = editor.config;\n var colors = config.colors || [];\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 120,\n $title: $('

    文字颜色

    '),\n type: 'inline-block', // droplist 内容以 block 形式展示\n list: colors.map(function (color) {\n return { $elem: $(''), value: color };\n }),\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 ForeColor 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nForeColor.prototype = {\n constructor: ForeColor,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n editor.cmd.do('foreColor', value);\n }\n};\n\n/*\n menu - BackColor\n*/\n// 构造函数\nfunction BackColor(editor) {\n var _this = this;\n\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'droplist';\n\n // 获取配置的颜色\n var config = editor.config;\n var colors = config.colors || [];\n\n // 当前是否 active 状态\n this._active = false;\n\n // 初始化 droplist\n this.droplist = new DropList(this, {\n width: 120,\n $title: $('

    背景色

    '),\n type: 'inline-block', // droplist 内容以 block 形式展示\n list: colors.map(function (color) {\n return { $elem: $(''), value: color };\n }),\n onClick: function onClick(value) {\n // 注意 this 是指向当前的 BackColor 对象\n _this._command(value);\n }\n });\n}\n\n// 原型\nBackColor.prototype = {\n constructor: BackColor,\n\n // 执行命令\n _command: function _command(value) {\n var editor = this.editor;\n editor.cmd.do('backColor', value);\n }\n};\n\n/*\n menu - quote\n*/\n// 构造函数\nfunction Quote(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'click';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nQuote.prototype = {\n constructor: Quote,\n\n onClick: function onClick(e) {\n var editor = this.editor;\n var $selectionElem = editor.selection.getSelectionContainerElem();\n var nodeName = $selectionElem.getNodeName();\n\n if (!UA.isIE()) {\n if (nodeName === 'BLOCKQUOTE') {\n // 撤销 quote\n editor.cmd.do('formatBlock', '

    ');\n } else {\n // 转换为 quote\n editor.cmd.do('formatBlock', '

    ');\n }\n return;\n }\n\n // IE 中不支持 formatBlock
    ,要用其他方式兼容\n var content = void 0,\n $targetELem = void 0;\n if (nodeName === 'P') {\n // 将 P 转换为 quote\n content = $selectionElem.text();\n $targetELem = $('
    ' + content + '
    ');\n $targetELem.insertAfter($selectionElem);\n $selectionElem.remove();\n return;\n }\n if (nodeName === 'BLOCKQUOTE') {\n // 撤销 quote\n content = $selectionElem.text();\n $targetELem = $('

    ' + content + '

    ');\n $targetELem.insertAfter($selectionElem);\n $selectionElem.remove();\n }\n },\n\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n var reg = /^BLOCKQUOTE$/i;\n var cmdValue = editor.cmd.queryCommandValue('formatBlock');\n if (reg.test(cmdValue)) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n menu - code\n*/\n// 构造函数\nfunction Code(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nCode.prototype = {\n constructor: Code,\n\n onClick: function onClick(e) {\n var editor = this.editor;\n var $startElem = editor.selection.getSelectionStartElem();\n var $endElem = editor.selection.getSelectionEndElem();\n var isSeleEmpty = editor.selection.isSelectionEmpty();\n var selectionText = editor.selection.getSelectionText();\n var $code = void 0;\n\n if (!$startElem.equal($endElem)) {\n // 跨元素选择,不做处理\n editor.selection.restoreSelection();\n return;\n }\n if (!isSeleEmpty) {\n // 选取不是空,用 包裹即可\n $code = $('' + selectionText + '');\n editor.cmd.do('insertElem', $code);\n editor.selection.createRangeByElem($code, false);\n editor.selection.restoreSelection();\n return;\n }\n\n // 选取是空,且没有夸元素选择,则插入
    \n        if (this._active) {\n            // 选中状态,将编辑内容\n            this._createPanel($startElem.html());\n        } else {\n            // 未选中状态,将创建内容\n            this._createPanel();\n        }\n    },\n\n    _createPanel: function _createPanel(value) {\n        var _this = this;\n\n        // value - 要编辑的内容\n        value = value || '';\n        var type = !value ? 'new' : 'edit';\n        var textId = getRandom('texxt');\n        var btnId = getRandom('btn');\n\n        var panel = new Panel(this, {\n            width: 500,\n            // 一个 Panel 包含多个 tab\n            tabs: [{\n                // 标题\n                title: '插入代码',\n                // 模板\n                tpl: '
    \\n \\n
    \\n \\n
    \\n
    ',\n // 事件绑定\n events: [\n // 插入代码\n {\n selector: '#' + btnId,\n type: 'click',\n fn: function fn() {\n var $text = $('#' + textId);\n var text = $text.val() || $text.html();\n text = replaceHtmlSymbol(text);\n if (type === 'new') {\n // 新插入\n _this._insertCode(text);\n } else {\n // 编辑更新\n _this._updateCode(text);\n }\n\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n } // first tab end\n ] // tabs end\n }); // new Panel end\n\n // 显示 panel\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 插入代码\n _insertCode: function _insertCode(value) {\n var editor = this.editor;\n editor.cmd.do('insertHTML', '
    ' + value + '


    ');\n },\n\n // 更新代码\n _updateCode: function _updateCode(value) {\n var editor = this.editor;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n $selectionELem.html(value);\n editor.selection.restoreSelection();\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n var $parentElem = $selectionELem.parent();\n if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n menu - emoticon\n*/\n// 构造函数\nfunction Emoticon(editor) {\n this.editor = editor;\n this.$elem = $('
    \\n \\n
    ');\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nEmoticon.prototype = {\n constructor: Emoticon,\n\n onClick: function onClick() {\n this._createPanel();\n },\n\n _createPanel: function _createPanel() {\n var _this = this;\n\n var editor = this.editor;\n var config = editor.config;\n // 获取表情配置\n var emotions = config.emotions || [];\n\n // 创建表情 dropPanel 的配置\n var tabConfig = [];\n emotions.forEach(function (emotData) {\n var emotType = emotData.type;\n var content = emotData.content || [];\n\n // 这一组表情最终拼接出来的 html\n var faceHtml = '';\n\n // emoji 表情\n if (emotType === 'emoji') {\n content.forEach(function (item) {\n if (item) {\n faceHtml += '' + item + '';\n }\n });\n }\n // 图片表情\n if (emotType === 'image') {\n content.forEach(function (item) {\n var src = item.src;\n var alt = item.alt;\n if (src) {\n // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片\n faceHtml += '\"'';\n }\n });\n }\n\n tabConfig.push({\n title: emotData.title,\n tpl: '
    ' + faceHtml + '
    ',\n events: [{\n selector: 'span.w-e-item',\n type: 'click',\n fn: function fn(e) {\n var target = e.target;\n var $target = $(target);\n var nodeName = $target.getNodeName();\n\n var insertHtml = void 0;\n if (nodeName === 'IMG') {\n // 插入图片\n insertHtml = $target.parent().html();\n } else {\n // 插入 emoji\n insertHtml = '' + $target.html() + '';\n }\n\n _this._insert(insertHtml);\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n });\n });\n\n var panel = new Panel(this, {\n width: 300,\n height: 200,\n // 一个 Panel 包含多个 tab\n tabs: tabConfig\n });\n\n // 显示 panel\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 插入表情\n _insert: function _insert(emotHtml) {\n var editor = this.editor;\n editor.cmd.do('insertHTML', emotHtml);\n }\n};\n\n/*\n menu - table\n*/\n// 构造函数\nfunction Table(editor) {\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nTable.prototype = {\n constructor: Table,\n\n onClick: function onClick() {\n if (this._active) {\n // 编辑现有表格\n this._createEditPanel();\n } else {\n // 插入新表格\n this._createInsertPanel();\n }\n },\n\n // 创建插入新表格的 panel\n _createInsertPanel: function _createInsertPanel() {\n var _this = this;\n\n // 用到的 id\n var btnInsertId = getRandom('btn');\n var textRowNum = getRandom('row');\n var textColNum = getRandom('col');\n\n var panel = new Panel(this, {\n width: 250,\n // panel 包含多个 tab\n tabs: [{\n // 标题\n title: '插入表格',\n // 模板\n tpl: '
    \\n

    \\n \\u521B\\u5EFA\\n \\n \\u884C\\n \\n \\u5217\\u7684\\u8868\\u683C\\n

    \\n
    \\n \\n
    \\n
    ',\n // 事件绑定\n events: [{\n // 点击按钮,插入表格\n selector: '#' + btnInsertId,\n type: 'click',\n fn: function fn() {\n var rowNum = parseInt($('#' + textRowNum).val());\n var colNum = parseInt($('#' + textColNum).val());\n\n if (rowNum && colNum && rowNum > 0 && colNum > 0) {\n // form 数据有效\n _this._insert(rowNum, colNum);\n }\n\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n } // first tab end\n ] // tabs end\n }); // panel end\n\n // 展示 panel\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 插入表格\n _insert: function _insert(rowNum, colNum) {\n // 拼接 table 模板\n var r = void 0,\n c = void 0;\n var html = '';\n for (r = 0; r < rowNum; r++) {\n html += '';\n if (r === 0) {\n for (c = 0; c < colNum; c++) {\n html += '';\n }\n } else {\n for (c = 0; c < colNum; c++) {\n html += '';\n }\n }\n html += '';\n }\n html += '
      


    ';\n\n // 执行命令\n var editor = this.editor;\n editor.cmd.do('insertHTML', html);\n\n // 防止 firefox 下出现 resize 的控制点\n editor.cmd.do('enableObjectResizing', false);\n editor.cmd.do('enableInlineTableEditing', false);\n },\n\n // 创建编辑表格的 panel\n _createEditPanel: function _createEditPanel() {\n var _this2 = this;\n\n // 可用的 id\n var addRowBtnId = getRandom('add-row');\n var addColBtnId = getRandom('add-col');\n var delRowBtnId = getRandom('del-row');\n var delColBtnId = getRandom('del-col');\n var delTableBtnId = getRandom('del-table');\n\n // 创建 panel 对象\n var panel = new Panel(this, {\n width: 320,\n // panel 包含多个 tab\n tabs: [{\n // 标题\n title: '编辑表格',\n // 模板\n tpl: '
    \\n
    \\n \\n \\n \\n \\n
    \\n
    \\n \\n \\n
    ',\n // 事件绑定\n events: [{\n // 增加行\n selector: '#' + addRowBtnId,\n type: 'click',\n fn: function fn() {\n _this2._addRow();\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n // 增加列\n selector: '#' + addColBtnId,\n type: 'click',\n fn: function fn() {\n _this2._addCol();\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n // 删除行\n selector: '#' + delRowBtnId,\n type: 'click',\n fn: function fn() {\n _this2._delRow();\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n // 删除列\n selector: '#' + delColBtnId,\n type: 'click',\n fn: function fn() {\n _this2._delCol();\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n // 删除表格\n selector: '#' + delTableBtnId,\n type: 'click',\n fn: function fn() {\n _this2._delTable();\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n }]\n });\n // 显示 panel\n panel.show();\n },\n\n // 获取选中的单元格的位置信息\n _getLocationData: function _getLocationData() {\n var result = {};\n var editor = this.editor;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n var nodeName = $selectionELem.getNodeName();\n if (nodeName !== 'TD' && nodeName !== 'TH') {\n return;\n }\n\n // 获取 td index\n var $tr = $selectionELem.parent();\n var $tds = $tr.children();\n var tdLength = $tds.length;\n $tds.forEach(function (td, index) {\n if (td === $selectionELem[0]) {\n // 记录并跳出循环\n result.td = {\n index: index,\n elem: td,\n length: tdLength\n };\n return false;\n }\n });\n\n // 获取 tr index\n var $tbody = $tr.parent();\n var $trs = $tbody.children();\n var trLength = $trs.length;\n $trs.forEach(function (tr, index) {\n if (tr === $tr[0]) {\n // 记录并跳出循环\n result.tr = {\n index: index,\n elem: tr,\n length: trLength\n };\n return false;\n }\n });\n\n // 返回结果\n return result;\n },\n\n // 增加行\n _addRow: function _addRow() {\n // 获取当前单元格的位置信息\n var locationData = this._getLocationData();\n if (!locationData) {\n return;\n }\n var trData = locationData.tr;\n var $currentTr = $(trData.elem);\n var tdData = locationData.td;\n var tdLength = tdData.length;\n\n // 拼接即将插入的字符串\n var newTr = document.createElement('tr');\n var tpl = '',\n i = void 0;\n for (i = 0; i < tdLength; i++) {\n tpl += ' ';\n }\n newTr.innerHTML = tpl;\n // 插入\n $(newTr).insertAfter($currentTr);\n },\n\n // 增加列\n _addCol: function _addCol() {\n // 获取当前单元格的位置信息\n var locationData = this._getLocationData();\n if (!locationData) {\n return;\n }\n var trData = locationData.tr;\n var tdData = locationData.td;\n var tdIndex = tdData.index;\n var $currentTr = $(trData.elem);\n var $trParent = $currentTr.parent();\n var $trs = $trParent.children();\n\n // 遍历所有行\n $trs.forEach(function (tr) {\n var $tr = $(tr);\n var $tds = $tr.children();\n var $currentTd = $tds.get(tdIndex);\n var name = $currentTd.getNodeName().toLowerCase();\n\n // new 一个 td,并插入\n var newTd = document.createElement(name);\n $(newTd).insertAfter($currentTd);\n });\n },\n\n // 删除行\n _delRow: function _delRow() {\n // 获取当前单元格的位置信息\n var locationData = this._getLocationData();\n if (!locationData) {\n return;\n }\n var trData = locationData.tr;\n var $currentTr = $(trData.elem);\n $currentTr.remove();\n },\n\n // 删除列\n _delCol: function _delCol() {\n // 获取当前单元格的位置信息\n var locationData = this._getLocationData();\n if (!locationData) {\n return;\n }\n var trData = locationData.tr;\n var tdData = locationData.td;\n var tdIndex = tdData.index;\n var $currentTr = $(trData.elem);\n var $trParent = $currentTr.parent();\n var $trs = $trParent.children();\n\n // 遍历所有行\n $trs.forEach(function (tr) {\n var $tr = $(tr);\n var $tds = $tr.children();\n var $currentTd = $tds.get(tdIndex);\n // 删除\n $currentTd.remove();\n });\n },\n\n // 删除表格\n _delTable: function _delTable() {\n var editor = this.editor;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n var $table = $selectionELem.parentUntil('table');\n if (!$table) {\n return;\n }\n $table.remove();\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n var $selectionELem = editor.selection.getSelectionContainerElem();\n if (!$selectionELem) {\n return;\n }\n var nodeName = $selectionELem.getNodeName();\n if (nodeName === 'TD' || nodeName === 'TH') {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n menu - video\n*/\n// 构造函数\nfunction Video(editor) {\n this.editor = editor;\n this.$elem = $('
    ');\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nVideo.prototype = {\n constructor: Video,\n\n onClick: function onClick() {\n this._createPanel();\n },\n\n _createPanel: function _createPanel() {\n var _this = this;\n\n // 创建 id\n var textValId = getRandom('text-val');\n var btnId = getRandom('btn');\n\n // 创建 panel\n var panel = new Panel(this, {\n width: 350,\n // 一个 panel 多个 tab\n tabs: [{\n // 标题\n title: '插入视频',\n // 模板\n tpl: '
    \\n \"/>\\n
    \\n \\n
    \\n
    ',\n // 事件绑定\n events: [{\n selector: '#' + btnId,\n type: 'click',\n fn: function fn() {\n var $text = $('#' + textValId);\n var val = $text.val().trim();\n\n // 测试用视频地址\n // \n\n if (val) {\n // 插入视频\n _this._insert(val);\n }\n\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n } // first tab end\n ] // tabs end\n }); // panel end\n\n // 显示 panel\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 插入视频\n _insert: function _insert(val) {\n var editor = this.editor;\n editor.cmd.do('insertHTML', val + '


    ');\n }\n};\n\n/*\n menu - img\n*/\n// 构造函数\nfunction Image(editor) {\n this.editor = editor;\n var imgMenuId = getRandom('w-e-img');\n this.$elem = $('
    ');\n editor.imgMenuId = imgMenuId;\n this.type = 'panel';\n\n // 当前是否 active 状态\n this._active = false;\n}\n\n// 原型\nImage.prototype = {\n constructor: Image,\n\n onClick: function onClick() {\n var editor = this.editor;\n var config = editor.config;\n if (config.qiniu) {\n return;\n }\n if (this._active) {\n this._createEditPanel();\n } else {\n this._createInsertPanel();\n }\n },\n\n _createEditPanel: function _createEditPanel() {\n var editor = this.editor;\n\n // id\n var width30 = getRandom('width-30');\n var width50 = getRandom('width-50');\n var width100 = getRandom('width-100');\n var delBtn = getRandom('del-btn');\n\n // tab 配置\n var tabsConfig = [{\n title: '编辑图片',\n tpl: '
    \\n
    \\n \\u6700\\u5927\\u5BBD\\u5EA6\\uFF1A\\n \\n \\n \\n
    \\n
    \\n \\n \\n
    ',\n events: [{\n selector: '#' + width30,\n type: 'click',\n fn: function fn() {\n var $img = editor._selectedImg;\n if ($img) {\n $img.css('max-width', '30%');\n }\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n selector: '#' + width50,\n type: 'click',\n fn: function fn() {\n var $img = editor._selectedImg;\n if ($img) {\n $img.css('max-width', '50%');\n }\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n selector: '#' + width100,\n type: 'click',\n fn: function fn() {\n var $img = editor._selectedImg;\n if ($img) {\n $img.css('max-width', '100%');\n }\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }, {\n selector: '#' + delBtn,\n type: 'click',\n fn: function fn() {\n var $img = editor._selectedImg;\n if ($img) {\n $img.remove();\n }\n // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n return true;\n }\n }]\n }];\n\n // 创建 panel 并显示\n var panel = new Panel(this, {\n width: 300,\n tabs: tabsConfig\n });\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n _createInsertPanel: function _createInsertPanel() {\n var editor = this.editor;\n var uploadImg = editor.uploadImg;\n var config = editor.config;\n\n // id\n var upTriggerId = getRandom('up-trigger');\n var upFileId = getRandom('up-file');\n var linkUrlId = getRandom('link-url');\n var linkBtnId = getRandom('link-btn');\n\n // tabs 的配置\n var tabsConfig = [{\n title: '上传图片',\n tpl: '
    \\n
    \\n \\n
    \\n
    \\n \\n
    \\n
    ',\n events: [{\n // 触发选择图片\n selector: '#' + upTriggerId,\n type: 'click',\n fn: function fn() {\n var $file = $('#' + upFileId);\n var fileElem = $file[0];\n if (fileElem) {\n fileElem.click();\n } else {\n // 返回 true 可关闭 panel\n return true;\n }\n }\n }, {\n // 选择图片完毕\n selector: '#' + upFileId,\n type: 'change',\n fn: function fn() {\n var $file = $('#' + upFileId);\n var fileElem = $file[0];\n if (!fileElem) {\n // 返回 true 可关闭 panel\n return true;\n }\n\n // 获取选中的 file 对象列表\n var fileList = fileElem.files;\n if (fileList.length) {\n uploadImg.uploadImg(fileList);\n }\n\n // 返回 true 可关闭 panel\n return true;\n }\n }]\n }, // first tab end\n {\n title: '网络图片',\n tpl: '
    \\n \\n
    \\n \\n
    \\n
    ',\n events: [{\n selector: '#' + linkBtnId,\n type: 'click',\n fn: function fn() {\n var $linkUrl = $('#' + linkUrlId);\n var url = $linkUrl.val().trim();\n\n if (url) {\n uploadImg.insertLinkImg(url);\n }\n\n // 返回 true 表示函数执行结束之后关闭 panel\n return true;\n }\n }]\n } // second tab end\n ]; // tabs end\n\n // 判断 tabs 的显示\n var tabsConfigResult = [];\n if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) {\n // 显示“上传图片”\n tabsConfigResult.push(tabsConfig[0]);\n }\n if (config.showLinkImg) {\n // 显示“网络图片”\n tabsConfigResult.push(tabsConfig[1]);\n }\n\n // 创建 panel 并显示\n var panel = new Panel(this, {\n width: 300,\n tabs: tabsConfigResult\n });\n panel.show();\n\n // 记录属性\n this.panel = panel;\n },\n\n // 试图改变 active 状态\n tryChangeActive: function tryChangeActive(e) {\n var editor = this.editor;\n var $elem = this.$elem;\n if (editor._selectedImg) {\n this._active = true;\n $elem.addClass('w-e-active');\n } else {\n this._active = false;\n $elem.removeClass('w-e-active');\n }\n }\n};\n\n/*\n 所有菜单的汇总\n*/\n\n// 存储菜单的构造函数\nvar MenuConstructors = {};\n\nMenuConstructors.bold = Bold;\n\nMenuConstructors.head = Head;\n\nMenuConstructors.fontSize = FontSize;\n\nMenuConstructors.fontName = FontName;\n\nMenuConstructors.link = Link;\n\nMenuConstructors.italic = Italic;\n\nMenuConstructors.redo = Redo;\n\nMenuConstructors.strikeThrough = StrikeThrough;\n\nMenuConstructors.underline = Underline;\n\nMenuConstructors.undo = Undo;\n\nMenuConstructors.list = List;\n\nMenuConstructors.justify = Justify;\n\nMenuConstructors.foreColor = ForeColor;\n\nMenuConstructors.backColor = BackColor;\n\nMenuConstructors.quote = Quote;\n\nMenuConstructors.code = Code;\n\nMenuConstructors.emoticon = Emoticon;\n\nMenuConstructors.table = Table;\n\nMenuConstructors.video = Video;\n\nMenuConstructors.image = Image;\n\n/*\n 菜单集合\n*/\n// 构造函数\nfunction Menus(editor) {\n this.editor = editor;\n this.menus = {};\n}\n\n// 修改原型\nMenus.prototype = {\n constructor: Menus,\n\n // 初始化菜单\n init: function init() {\n var _this = this;\n\n var editor = this.editor;\n var config = editor.config || {};\n var configMenus = config.menus || []; // 获取配置中的菜单\n\n // 根据配置信息,创建菜单\n configMenus.forEach(function (menuKey) {\n var MenuConstructor = MenuConstructors[menuKey];\n if (MenuConstructor && typeof MenuConstructor === 'function') {\n // 创建单个菜单\n _this.menus[menuKey] = new MenuConstructor(editor);\n }\n });\n\n // 添加到菜单栏\n this._addToToolbar();\n\n // 绑定事件\n this._bindEvent();\n },\n\n // 添加到菜单栏\n _addToToolbar: function _addToToolbar() {\n var editor = this.editor;\n var $toolbarElem = editor.$toolbarElem;\n var menus = this.menus;\n var config = editor.config;\n // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1\n var zIndex = config.zIndex + 1;\n objForEach(menus, function (key, menu) {\n var $elem = menu.$elem;\n if ($elem) {\n // 设置 z-index\n $elem.css('z-index', zIndex);\n $toolbarElem.append($elem);\n }\n });\n },\n\n // 绑定菜单 click mouseenter 事件\n _bindEvent: function _bindEvent() {\n var menus = this.menus;\n var editor = this.editor;\n objForEach(menus, function (key, menu) {\n var type = menu.type;\n if (!type) {\n return;\n }\n var $elem = menu.$elem;\n var droplist = menu.droplist;\n var panel = menu.panel;\n\n // 点击类型,例如 bold\n if (type === 'click' && menu.onClick) {\n $elem.on('click', function (e) {\n if (editor.selection.getRange() == null) {\n return;\n }\n menu.onClick(e);\n });\n }\n\n // 下拉框,例如 head\n if (type === 'droplist' && droplist) {\n $elem.on('mouseenter', function (e) {\n if (editor.selection.getRange() == null) {\n return;\n }\n // 显示\n droplist.showTimeoutId = setTimeout(function () {\n droplist.show();\n }, 200);\n }).on('mouseleave', function (e) {\n // 隐藏\n droplist.hideTimeoutId = setTimeout(function () {\n droplist.hide();\n }, 0);\n });\n }\n\n // 弹框类型,例如 link\n if (type === 'panel' && menu.onClick) {\n $elem.on('click', function (e) {\n e.stopPropagation();\n if (editor.selection.getRange() == null) {\n return;\n }\n // 在自定义事件中显示 panel\n menu.onClick(e);\n });\n }\n });\n },\n\n // 尝试修改菜单状态\n changeActive: function changeActive() {\n var menus = this.menus;\n objForEach(menus, function (key, menu) {\n if (menu.tryChangeActive) {\n setTimeout(function () {\n menu.tryChangeActive();\n }, 100);\n }\n });\n }\n};\n\n/*\n 粘贴信息的处理\n*/\n\n// 获取粘贴的纯文本\nfunction getPasteText(e) {\n var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;\n var pasteText = void 0;\n if (clipboardData == null) {\n pasteText = window.clipboardData && window.clipboardData.getData('text');\n } else {\n pasteText = clipboardData.getData('text/plain');\n }\n\n return replaceHtmlSymbol(pasteText);\n}\n\n// 获取粘贴的html\nfunction getPasteHtml(e, filterStyle, ignoreImg) {\n var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;\n var pasteText = void 0,\n pasteHtml = void 0;\n if (clipboardData == null) {\n pasteText = window.clipboardData && window.clipboardData.getData('text');\n } else {\n pasteText = clipboardData.getData('text/plain');\n pasteHtml = clipboardData.getData('text/html');\n }\n if (!pasteHtml && pasteText) {\n pasteHtml = '

    ' + replaceHtmlSymbol(pasteText) + '

    ';\n }\n if (!pasteHtml) {\n return;\n }\n\n // 过滤word中状态过来的无用字符\n var docSplitHtml = pasteHtml.split('');\n if (docSplitHtml.length === 2) {\n pasteHtml = docSplitHtml[0];\n }\n\n // 过滤无用标签\n pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '');\n // 去掉注释\n pasteHtml = pasteHtml.replace(//mg, '');\n // 过滤 data-xxx 属性\n pasteHtml = pasteHtml.replace(/\\s?data-.+?=('|\").+?('|\")/igm, '');\n\n if (ignoreImg) {\n // 忽略图片\n pasteHtml = pasteHtml.replace(//igm, '');\n }\n\n if (filterStyle) {\n // 过滤样式\n pasteHtml = pasteHtml.replace(/\\s?(class|style)=('|\").*?('|\")/igm, '');\n } else {\n // 保留样式\n pasteHtml = pasteHtml.replace(/\\s?class=('|\").*?('|\")/igm, '');\n }\n\n return pasteHtml;\n}\n\n// 获取粘贴的图片文件\nfunction getPasteImgs(e) {\n var result = [];\n var txt = getPasteText(e);\n if (txt) {\n // 有文字,就忽略图片\n return result;\n }\n\n var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {};\n var items = clipboardData.items;\n if (!items) {\n return result;\n }\n\n objForEach(items, function (key, value) {\n var type = value.type;\n if (/image/i.test(type)) {\n result.push(value.getAsFile());\n }\n });\n\n return result;\n}\n\n/*\n 编辑区域\n*/\n\n// 获取一个 elem.childNodes 的 JSON 数据\nfunction getChildrenJSON($elem) {\n var result = [];\n var $children = $elem.childNodes() || []; // 注意 childNodes() 可以获取文本节点\n $children.forEach(function (curElem) {\n var elemResult = void 0;\n var nodeType = curElem.nodeType;\n\n // 文本节点\n if (nodeType === 3) {\n elemResult = curElem.textContent;\n elemResult = replaceHtmlSymbol(elemResult);\n }\n\n // 普通 DOM 节点\n if (nodeType === 1) {\n elemResult = {};\n\n // tag\n elemResult.tag = curElem.nodeName.toLowerCase();\n // attr\n var attrData = [];\n var attrList = curElem.attributes || {};\n var attrListLength = attrList.length || 0;\n for (var i = 0; i < attrListLength; i++) {\n var attr = attrList[i];\n attrData.push({\n name: attr.name,\n value: attr.value\n });\n }\n elemResult.attrs = attrData;\n // children(递归)\n elemResult.children = getChildrenJSON($(curElem));\n }\n\n result.push(elemResult);\n });\n return result;\n}\n\n// 构造函数\nfunction Text(editor) {\n this.editor = editor;\n}\n\n// 修改原型\nText.prototype = {\n constructor: Text,\n\n // 初始化\n init: function init() {\n // 绑定事件\n this._bindEvent();\n },\n\n // 清空内容\n clear: function clear() {\n this.html('


    ');\n },\n\n // 获取 设置 html\n html: function html(val) {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n var html = void 0;\n if (val == null) {\n html = $textElem.html();\n // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 ​ ,这里替换掉\n html = html.replace(/\\u200b/gm, '');\n return html;\n } else {\n $textElem.html(val);\n\n // 初始化选取,将光标定位到内容尾部\n editor.initSelection();\n }\n },\n\n // 获取 JSON\n getJSON: function getJSON() {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n return getChildrenJSON($textElem);\n },\n\n // 获取 设置 text\n text: function text(val) {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n var text = void 0;\n if (val == null) {\n text = $textElem.text();\n // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 ​ ,这里替换掉\n text = text.replace(/\\u200b/gm, '');\n return text;\n } else {\n $textElem.text('

    ' + val + '

    ');\n\n // 初始化选取,将光标定位到内容尾部\n editor.initSelection();\n }\n },\n\n // 追加内容\n append: function append(html) {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n $textElem.append($(html));\n\n // 初始化选取,将光标定位到内容尾部\n editor.initSelection();\n },\n\n // 绑定事件\n _bindEvent: function _bindEvent() {\n // 实时保存选取\n this._saveRangeRealTime();\n\n // 按回车建时的特殊处理\n this._enterKeyHandle();\n\n // 清空时保留


    \n this._clearHandle();\n\n // 粘贴事件(粘贴文字,粘贴图片)\n this._pasteHandle();\n\n // tab 特殊处理\n this._tabHandle();\n\n // img 点击\n this._imgHandle();\n\n // 拖拽事件\n this._dragHandle();\n },\n\n // 实时保存选取\n _saveRangeRealTime: function _saveRangeRealTime() {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n\n // 保存当前的选区\n function saveRange(e) {\n // 随时保存选区\n editor.selection.saveRange();\n // 更新按钮 ative 状态\n editor.menus.changeActive();\n }\n // 按键后保存\n $textElem.on('keyup', saveRange);\n $textElem.on('mousedown', function (e) {\n // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区\n $textElem.on('mouseleave', saveRange);\n });\n $textElem.on('mouseup', function (e) {\n saveRange();\n // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件\n $textElem.off('mouseleave', saveRange);\n });\n },\n\n // 按回车键时的特殊处理\n _enterKeyHandle: function _enterKeyHandle() {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n\n function insertEmptyP($selectionElem) {\n var $p = $('


    ');\n $p.insertBefore($selectionElem);\n editor.selection.createRangeByElem($p, true);\n editor.selection.restoreSelection();\n $selectionElem.remove();\n }\n\n // 将回车之后生成的非

    的顶级标签,改为

    \n function pHandle(e) {\n var $selectionElem = editor.selection.getSelectionContainerElem();\n var $parentElem = $selectionElem.parent();\n\n if ($parentElem.html() === '
    ') {\n // 回车之前光标所在一个

    .....

    ,忽然回车生成一个空的


    \n // 而且继续回车跳不出去,因此只能特殊处理\n insertEmptyP($selectionElem);\n return;\n }\n\n if (!$parentElem.equal($textElem)) {\n // 不是顶级标签\n return;\n }\n\n var nodeName = $selectionElem.getNodeName();\n if (nodeName === 'P') {\n // 当前的标签是 P ,不用做处理\n return;\n }\n\n if ($selectionElem.text()) {\n // 有内容,不做处理\n return;\n }\n\n // 插入

    ,并将选取定位到

    ,删除当前标签\n insertEmptyP($selectionElem);\n }\n\n $textElem.on('keyup', function (e) {\n if (e.keyCode !== 13) {\n // 不是回车键\n return;\n }\n // 将回车之后生成的非

    的顶级标签,改为

    \n pHandle(e);\n });\n\n //

    回车时 特殊处理\n function codeHandle(e) {\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if (!$selectionElem) {\n return;\n }\n var $parentElem = $selectionElem.parent();\n var selectionNodeName = $selectionElem.getNodeName();\n var parentNodeName = $parentElem.getNodeName();\n\n if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {\n // 不符合要求 忽略\n return;\n }\n\n if (!editor.cmd.queryCommandSupported('insertHTML')) {\n // 必须原生支持 insertHTML 命令\n return;\n }\n\n // 处理:光标定位到代码末尾,联系点击两次回车,即跳出代码块\n if (editor._willBreakCode === true) {\n // 此时可以跳出代码块\n // 插入

    ,并将选取定位到

    \n var $p = $('


    ');\n $p.insertAfter($parentElem);\n editor.selection.createRangeByElem($p, true);\n editor.selection.restoreSelection();\n\n // 修改状态\n editor._willBreakCode = false;\n\n e.preventDefault();\n return;\n }\n\n var _startOffset = editor.selection.getRange().startOffset;\n\n // 处理:回车时,不能插入
    而是插入 \\n ,因为是在 pre 标签里面\n editor.cmd.do('insertHTML', '\\n');\n editor.selection.saveRange();\n if (editor.selection.getRange().startOffset === _startOffset) {\n // 没起作用,再来一遍\n editor.cmd.do('insertHTML', '\\n');\n }\n\n var codeLength = $selectionElem.html().length;\n if (editor.selection.getRange().startOffset + 1 === codeLength) {\n // 说明光标在代码最后的位置,执行了回车操作\n // 记录下来,以便下次回车时候跳出 code\n editor._willBreakCode = true;\n }\n\n // 阻止默认行为\n e.preventDefault();\n }\n\n $textElem.on('keydown', function (e) {\n if (e.keyCode !== 13) {\n // 不是回车键\n // 取消即将跳转代码块的记录\n editor._willBreakCode = false;\n return;\n }\n //
    回车时 特殊处理\n codeHandle(e);\n });\n },\n\n // 清空时保留


    \n _clearHandle: function _clearHandle() {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n\n $textElem.on('keydown', function (e) {\n if (e.keyCode !== 8) {\n return;\n }\n var txtHtml = $textElem.html().toLowerCase().trim();\n if (txtHtml === '


    ') {\n // 最后剩下一个空行,就不再删除了\n e.preventDefault();\n return;\n }\n });\n\n $textElem.on('keyup', function (e) {\n if (e.keyCode !== 8) {\n return;\n }\n var $p = void 0;\n var txtHtml = $textElem.html().toLowerCase().trim();\n\n // firefox 时用 txtHtml === '
    ' 判断,其他用 !txtHtml 判断\n if (!txtHtml || txtHtml === '
    ') {\n // 内容空了\n $p = $('


    ');\n $textElem.html(''); // 一定要先清空,否则在 firefox 下有问题\n $textElem.append($p);\n editor.selection.createRangeByElem($p, false, true);\n editor.selection.restoreSelection();\n }\n });\n },\n\n // 粘贴事件(粘贴文字 粘贴图片)\n _pasteHandle: function _pasteHandle() {\n var editor = this.editor;\n var config = editor.config;\n var pasteFilterStyle = config.pasteFilterStyle;\n var pasteTextHandle = config.pasteTextHandle;\n var ignoreImg = config.pasteIgnoreImg;\n var $textElem = editor.$textElem;\n\n // 粘贴图片、文本的事件,每次只能执行一个\n // 判断该次粘贴事件是否可以执行\n var pasteTime = 0;\n function canDo() {\n var now = Date.now();\n var flag = false;\n if (now - pasteTime >= 100) {\n // 间隔大于 100 ms ,可以执行\n flag = true;\n }\n pasteTime = now;\n return flag;\n }\n function resetTime() {\n pasteTime = 0;\n }\n\n // 粘贴文字\n $textElem.on('paste', function (e) {\n if (UA.isIE()) {\n return;\n } else {\n // 阻止默认行为,使用 execCommand 的粘贴命令\n e.preventDefault();\n }\n\n // 粘贴图片和文本,只能同时使用一个\n if (!canDo()) {\n return;\n }\n\n // 获取粘贴的文字\n var pasteHtml = getPasteHtml(e, pasteFilterStyle, ignoreImg);\n var pasteText = getPasteText(e);\n pasteText = pasteText.replace(/\\n/gm, '
    ');\n\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if (!$selectionElem) {\n return;\n }\n var nodeName = $selectionElem.getNodeName();\n\n // code 中只能粘贴纯文本\n if (nodeName === 'CODE' || nodeName === 'PRE') {\n if (pasteTextHandle && isFunction(pasteTextHandle)) {\n // 用户自定义过滤处理粘贴内容\n pasteText = '' + (pasteTextHandle(pasteText) || '');\n }\n editor.cmd.do('insertHTML', '

    ' + pasteText + '

    ');\n return;\n }\n\n // 先放开注释,有问题再追查 ————\n // // 表格中忽略,可能会出现异常问题\n // if (nodeName === 'TD' || nodeName === 'TH') {\n // return\n // }\n\n if (!pasteHtml) {\n // 没有内容,可继续执行下面的图片粘贴\n resetTime();\n return;\n }\n try {\n // firefox 中,获取的 pasteHtml 可能是没有
      包裹的
    • \n // 因此执行 insertHTML 会报错\n if (pasteTextHandle && isFunction(pasteTextHandle)) {\n // 用户自定义过滤处理粘贴内容\n pasteHtml = '' + (pasteTextHandle(pasteHtml) || '');\n }\n editor.cmd.do('insertHTML', pasteHtml);\n } catch (ex) {\n // 此时使用 pasteText 来兼容一下\n if (pasteTextHandle && isFunction(pasteTextHandle)) {\n // 用户自定义过滤处理粘贴内容\n pasteText = '' + (pasteTextHandle(pasteText) || '');\n }\n editor.cmd.do('insertHTML', '

      ' + pasteText + '

      ');\n }\n });\n\n // 粘贴图片\n $textElem.on('paste', function (e) {\n if (UA.isIE()) {\n return;\n } else {\n e.preventDefault();\n }\n\n // 粘贴图片和文本,只能同时使用一个\n if (!canDo()) {\n return;\n }\n\n // 获取粘贴的图片\n var pasteFiles = getPasteImgs(e);\n if (!pasteFiles || !pasteFiles.length) {\n return;\n }\n\n // 获取当前的元素\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if (!$selectionElem) {\n return;\n }\n var nodeName = $selectionElem.getNodeName();\n\n // code 中粘贴忽略\n if (nodeName === 'CODE' || nodeName === 'PRE') {\n return;\n }\n\n // 上传图片\n var uploadImg = editor.uploadImg;\n uploadImg.uploadImg(pasteFiles);\n });\n },\n\n // tab 特殊处理\n _tabHandle: function _tabHandle() {\n var editor = this.editor;\n var $textElem = editor.$textElem;\n\n $textElem.on('keydown', function (e) {\n if (e.keyCode !== 9) {\n return;\n }\n if (!editor.cmd.queryCommandSupported('insertHTML')) {\n // 必须原生支持 insertHTML 命令\n return;\n }\n var $selectionElem = editor.selection.getSelectionContainerElem();\n if (!$selectionElem) {\n return;\n }\n var $parentElem = $selectionElem.parent();\n var selectionNodeName = $selectionElem.getNodeName();\n var parentNodeName = $parentElem.getNodeName();\n\n if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {\n //
       里面\n                editor.cmd.do('insertHTML', '    ');\n            } else {\n                // 普通文字\n                editor.cmd.do('insertHTML', '    ');\n            }\n\n            e.preventDefault();\n        });\n    },\n\n    // img 点击\n    _imgHandle: function _imgHandle() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        // 为图片增加 selected 样式\n        $textElem.on('click', 'img', function (e) {\n            var img = this;\n            var $img = $(img);\n\n            if ($img.attr('data-w-e') === '1') {\n                // 是表情图片,忽略\n                return;\n            }\n\n            // 记录当前点击过的图片\n            editor._selectedImg = $img;\n\n            // 修改选区并 restore ,防止用户此时点击退格键,会删除其他内容\n            editor.selection.createRangeByElem($img);\n            editor.selection.restoreSelection();\n        });\n\n        // 去掉图片的 selected 样式\n        $textElem.on('click  keyup', function (e) {\n            if (e.target.matches('img')) {\n                // 点击的是图片,忽略\n                return;\n            }\n            // 删除记录\n            editor._selectedImg = null;\n        });\n    },\n\n    // 拖拽事件\n    _dragHandle: function _dragHandle() {\n        var editor = this.editor;\n\n        // 禁用 document 拖拽事件\n        var $document = $(document);\n        $document.on('dragleave drop dragenter dragover', function (e) {\n            e.preventDefault();\n        });\n\n        // 添加编辑区域拖拽事件\n        var $textElem = editor.$textElem;\n        $textElem.on('drop', function (e) {\n            e.preventDefault();\n            var files = e.dataTransfer && e.dataTransfer.files;\n            if (!files || !files.length) {\n                return;\n            }\n\n            // 上传图片\n            var uploadImg = editor.uploadImg;\n            uploadImg.uploadImg(files);\n        });\n    }\n};\n\n/*\n    命令,封装 document.execCommand\n*/\n\n// 构造函数\nfunction Command(editor) {\n    this.editor = editor;\n}\n\n// 修改原型\nCommand.prototype = {\n    constructor: Command,\n\n    // 执行命令\n    do: function _do(name, value) {\n        var editor = this.editor;\n\n        // 使用 styleWithCSS\n        if (!editor._useStyleWithCSS) {\n            document.execCommand('styleWithCSS', null, true);\n            editor._useStyleWithCSS = true;\n        }\n\n        // 如果无选区,忽略\n        if (!editor.selection.getRange()) {\n            return;\n        }\n\n        // 恢复选取\n        editor.selection.restoreSelection();\n\n        // 执行\n        var _name = '_' + name;\n        if (this[_name]) {\n            // 有自定义事件\n            this[_name](value);\n        } else {\n            // 默认 command\n            this._execCommand(name, value);\n        }\n\n        // 修改菜单状态\n        editor.menus.changeActive();\n\n        // 最后,恢复选取保证光标在原来的位置闪烁\n        editor.selection.saveRange();\n        editor.selection.restoreSelection();\n\n        // 触发 onchange\n        editor.change && editor.change();\n    },\n\n    // 自定义 insertHTML 事件\n    _insertHTML: function _insertHTML(html) {\n        var editor = this.editor;\n        var range = editor.selection.getRange();\n\n        if (this.queryCommandSupported('insertHTML')) {\n            // W3C\n            this._execCommand('insertHTML', html);\n        } else if (range.insertNode) {\n            // IE\n            range.deleteContents();\n            range.insertNode($(html)[0]);\n        } else if (range.pasteHTML) {\n            // IE <= 10\n            range.pasteHTML(html);\n        }\n    },\n\n    // 插入 elem\n    _insertElem: function _insertElem($elem) {\n        var editor = this.editor;\n        var range = editor.selection.getRange();\n\n        if (range.insertNode) {\n            range.deleteContents();\n            range.insertNode($elem[0]);\n        }\n    },\n\n    // 封装 execCommand\n    _execCommand: function _execCommand(name, value) {\n        document.execCommand(name, false, value);\n    },\n\n    // 封装 document.queryCommandValue\n    queryCommandValue: function queryCommandValue(name) {\n        return document.queryCommandValue(name);\n    },\n\n    // 封装 document.queryCommandState\n    queryCommandState: function queryCommandState(name) {\n        return document.queryCommandState(name);\n    },\n\n    // 封装 document.queryCommandSupported\n    queryCommandSupported: function queryCommandSupported(name) {\n        return document.queryCommandSupported(name);\n    }\n};\n\n/*\n    selection range API\n*/\n\n// 构造函数\nfunction API(editor) {\n    this.editor = editor;\n    this._currentRange = null;\n}\n\n// 修改原型\nAPI.prototype = {\n    constructor: API,\n\n    // 获取 range 对象\n    getRange: function getRange() {\n        return this._currentRange;\n    },\n\n    // 保存选区\n    saveRange: function saveRange(_range) {\n        if (_range) {\n            // 保存已有选区\n            this._currentRange = _range;\n            return;\n        }\n\n        // 获取当前的选区\n        var selection = window.getSelection();\n        if (selection.rangeCount === 0) {\n            return;\n        }\n        var range = selection.getRangeAt(0);\n\n        // 判断选区内容是否在编辑内容之内\n        var $containerElem = this.getSelectionContainerElem(range);\n        if (!$containerElem) {\n            return;\n        }\n\n        // 判断选区内容是否在不可编辑区域之内\n        if ($containerElem.attr('contenteditable') === 'false' || $containerElem.parentUntil('[contenteditable=false]')) {\n            return;\n        }\n\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        if ($textElem.isContain($containerElem)) {\n            // 是编辑内容之内的\n            this._currentRange = range;\n        }\n    },\n\n    // 折叠选区\n    collapseRange: function collapseRange(toStart) {\n        if (toStart == null) {\n            // 默认为 false\n            toStart = false;\n        }\n        var range = this._currentRange;\n        if (range) {\n            range.collapse(toStart);\n        }\n    },\n\n    // 选中区域的文字\n    getSelectionText: function getSelectionText() {\n        var range = this._currentRange;\n        if (range) {\n            return this._currentRange.toString();\n        } else {\n            return '';\n        }\n    },\n\n    // 选区的 $Elem\n    getSelectionContainerElem: function getSelectionContainerElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.commonAncestorContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n    getSelectionStartElem: function getSelectionStartElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.startContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n    getSelectionEndElem: function getSelectionEndElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.endContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n\n    // 选区是否为空\n    isSelectionEmpty: function isSelectionEmpty() {\n        var range = this._currentRange;\n        if (range && range.startContainer) {\n            if (range.startContainer === range.endContainer) {\n                if (range.startOffset === range.endOffset) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    },\n\n    // 恢复选区\n    restoreSelection: function restoreSelection() {\n        var selection = window.getSelection();\n        selection.removeAllRanges();\n        selection.addRange(this._currentRange);\n    },\n\n    // 创建一个空白(即 ​ 字符)选区\n    createEmptyRange: function createEmptyRange() {\n        var editor = this.editor;\n        var range = this.getRange();\n        var $elem = void 0;\n\n        if (!range) {\n            // 当前无 range\n            return;\n        }\n        if (!this.isSelectionEmpty()) {\n            // 当前选区必须没有内容才可以\n            return;\n        }\n\n        try {\n            // 目前只支持 webkit 内核\n            if (UA.isWebkit()) {\n                // 插入 ​\n                editor.cmd.do('insertHTML', '​');\n                // 修改 offset 位置\n                range.setEnd(range.endContainer, range.endOffset + 1);\n                // 存储\n                this.saveRange(range);\n            } else {\n                $elem = $('');\n                editor.cmd.do('insertElem', $elem);\n                this.createRangeByElem($elem, true);\n            }\n        } catch (ex) {\n            // 部分情况下会报错,兼容一下\n        }\n    },\n\n    // 根据 $Elem 设置选区\n    createRangeByElem: function createRangeByElem($elem, toStart, isContent) {\n        // $elem - 经过封装的 elem\n        // toStart - true 开始位置,false 结束位置\n        // isContent - 是否选中Elem的内容\n        if (!$elem.length) {\n            return;\n        }\n\n        var elem = $elem[0];\n        var range = document.createRange();\n\n        if (isContent) {\n            range.selectNodeContents(elem);\n        } else {\n            range.selectNode(elem);\n        }\n\n        if (typeof toStart === 'boolean') {\n            range.collapse(toStart);\n        }\n\n        // 存储 range\n        this.saveRange(range);\n    }\n};\n\n/*\n    上传进度条\n*/\n\nfunction Progress(editor) {\n    this.editor = editor;\n    this._time = 0;\n    this._isShow = false;\n    this._isRender = false;\n    this._timeoutId = 0;\n    this.$textContainer = editor.$textContainerElem;\n    this.$bar = $('
      ');\n}\n\nProgress.prototype = {\n constructor: Progress,\n\n show: function show(progress) {\n var _this = this;\n\n // 状态处理\n if (this._isShow) {\n return;\n }\n this._isShow = true;\n\n // 渲染\n var $bar = this.$bar;\n if (!this._isRender) {\n var $textContainer = this.$textContainer;\n $textContainer.append($bar);\n } else {\n this._isRender = true;\n }\n\n // 改变进度(节流,100ms 渲染一次)\n if (Date.now() - this._time > 100) {\n if (progress <= 1) {\n $bar.css('width', progress * 100 + '%');\n this._time = Date.now();\n }\n }\n\n // 隐藏\n var timeoutId = this._timeoutId;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(function () {\n _this._hide();\n }, 500);\n },\n\n _hide: function _hide() {\n var $bar = this.$bar;\n $bar.remove();\n\n // 修改状态\n this._time = 0;\n this._isShow = false;\n this._isRender = false;\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n/*\n 上传图片\n*/\n\n// 构造函数\nfunction UploadImg(editor) {\n this.editor = editor;\n}\n\n// 原型\nUploadImg.prototype = {\n constructor: UploadImg,\n\n // 根据 debug 弹出不同的信息\n _alert: function _alert(alertInfo, debugInfo) {\n var editor = this.editor;\n var debug = editor.config.debug;\n var customAlert = editor.config.customAlert;\n\n if (debug) {\n throw new Error('wangEditor: ' + (debugInfo || alertInfo));\n } else {\n if (customAlert && typeof customAlert === 'function') {\n customAlert(alertInfo);\n } else {\n alert(alertInfo);\n }\n }\n },\n\n // 根据链接插入图片\n insertLinkImg: function insertLinkImg(link) {\n var _this2 = this;\n\n if (!link) {\n return;\n }\n var editor = this.editor;\n var config = editor.config;\n\n // 校验格式\n var linkImgCheck = config.linkImgCheck;\n var checkResult = void 0;\n if (linkImgCheck && typeof linkImgCheck === 'function') {\n checkResult = linkImgCheck(link);\n if (typeof checkResult === 'string') {\n // 校验失败,提示信息\n alert(checkResult);\n return;\n }\n }\n\n editor.cmd.do('insertHTML', '');\n\n // 验证图片 url 是否有效,无效的话给出提示\n var img = document.createElement('img');\n img.onload = function () {\n var callback = config.linkImgCallback;\n if (callback && typeof callback === 'function') {\n callback(link);\n }\n\n img = null;\n };\n img.onerror = function () {\n img = null;\n // 无法成功下载图片\n _this2._alert('插入图片错误', 'wangEditor: \\u63D2\\u5165\\u56FE\\u7247\\u51FA\\u9519\\uFF0C\\u56FE\\u7247\\u94FE\\u63A5\\u662F \"' + link + '\"\\uFF0C\\u4E0B\\u8F7D\\u8BE5\\u94FE\\u63A5\\u5931\\u8D25');\n return;\n };\n img.onabort = function () {\n img = null;\n };\n img.src = link;\n },\n\n // 上传图片\n uploadImg: function uploadImg(files) {\n var _this3 = this;\n\n if (!files || !files.length) {\n return;\n }\n\n // ------------------------------ 获取配置信息 ------------------------------\n var editor = this.editor;\n var config = editor.config;\n var uploadImgServer = config.uploadImgServer;\n var uploadImgShowBase64 = config.uploadImgShowBase64;\n\n var maxSize = config.uploadImgMaxSize;\n var maxSizeM = maxSize / 1024 / 1024;\n var maxLength = config.uploadImgMaxLength || 10000;\n var uploadFileName = config.uploadFileName || '';\n var uploadImgParams = config.uploadImgParams || {};\n var uploadImgParamsWithUrl = config.uploadImgParamsWithUrl;\n var uploadImgHeaders = config.uploadImgHeaders || {};\n var hooks = config.uploadImgHooks || {};\n var timeout = config.uploadImgTimeout || 3000;\n var withCredentials = config.withCredentials;\n if (withCredentials == null) {\n withCredentials = false;\n }\n var customUploadImg = config.customUploadImg;\n\n if (!customUploadImg) {\n // 没有 customUploadImg 的情况下,需要如下两个配置才能继续进行图片上传\n if (!uploadImgServer && !uploadImgShowBase64) {\n return;\n }\n }\n\n // ------------------------------ 验证文件信息 ------------------------------\n var resultFiles = [];\n var errInfo = [];\n arrForEach(files, function (file) {\n var name = file.name;\n var size = file.size;\n\n // chrome 低版本 name === undefined\n if (!name || !size) {\n return;\n }\n\n if (/\\.(jpg|jpeg|png|bmp|gif|webp)$/i.test(name) === false) {\n // 后缀名不合法,不是图片\n errInfo.push('\\u3010' + name + '\\u3011\\u4E0D\\u662F\\u56FE\\u7247');\n return;\n }\n if (maxSize < size) {\n // 上传图片过大\n errInfo.push('\\u3010' + name + '\\u3011\\u5927\\u4E8E ' + maxSizeM + 'M');\n return;\n }\n\n // 验证通过的加入结果列表\n resultFiles.push(file);\n });\n // 抛出验证信息\n if (errInfo.length) {\n this._alert('图片验证未通过: \\n' + errInfo.join('\\n'));\n return;\n }\n if (resultFiles.length > maxLength) {\n this._alert('一次最多上传' + maxLength + '张图片');\n return;\n }\n\n // ------------------------------ 自定义上传 ------------------------------\n if (customUploadImg && typeof customUploadImg === 'function') {\n customUploadImg(resultFiles, this.insertLinkImg.bind(this));\n\n // 阻止以下代码执行\n return;\n }\n\n // 添加图片数据\n var formdata = new FormData();\n arrForEach(resultFiles, function (file) {\n var name = uploadFileName || file.name;\n formdata.append(name, file);\n });\n\n // ------------------------------ 上传图片 ------------------------------\n if (uploadImgServer && typeof uploadImgServer === 'string') {\n // 添加参数\n var uploadImgServerArr = uploadImgServer.split('#');\n uploadImgServer = uploadImgServerArr[0];\n var uploadImgServerHash = uploadImgServerArr[1] || '';\n objForEach(uploadImgParams, function (key, val) {\n // 因使用者反应,自定义参数不能默认 encode ,由 v3.1.1 版本开始注释掉\n // val = encodeURIComponent(val)\n\n // 第一,将参数拼接到 url 中\n if (uploadImgParamsWithUrl) {\n if (uploadImgServer.indexOf('?') > 0) {\n uploadImgServer += '&';\n } else {\n uploadImgServer += '?';\n }\n uploadImgServer = uploadImgServer + key + '=' + val;\n }\n\n // 第二,将参数添加到 formdata 中\n formdata.append(key, val);\n });\n if (uploadImgServerHash) {\n uploadImgServer += '#' + uploadImgServerHash;\n }\n\n // 定义 xhr\n var xhr = new XMLHttpRequest();\n xhr.open('POST', uploadImgServer);\n\n // 设置超时\n xhr.timeout = timeout;\n xhr.ontimeout = function () {\n // hook - timeout\n if (hooks.timeout && typeof hooks.timeout === 'function') {\n hooks.timeout(xhr, editor);\n }\n\n _this3._alert('上传图片超时');\n };\n\n // 监控 progress\n if (xhr.upload) {\n xhr.upload.onprogress = function (e) {\n var percent = void 0;\n // 进度条\n var progressBar = new Progress(editor);\n if (e.lengthComputable) {\n percent = e.loaded / e.total;\n progressBar.show(percent);\n }\n };\n }\n\n // 返回数据\n xhr.onreadystatechange = function () {\n var result = void 0;\n if (xhr.readyState === 4) {\n if (xhr.status < 200 || xhr.status >= 300) {\n // hook - error\n if (hooks.error && typeof hooks.error === 'function') {\n hooks.error(xhr, editor);\n }\n\n // xhr 返回状态错误\n _this3._alert('上传图片发生错误', '\\u4E0A\\u4F20\\u56FE\\u7247\\u53D1\\u751F\\u9519\\u8BEF\\uFF0C\\u670D\\u52A1\\u5668\\u8FD4\\u56DE\\u72B6\\u6001\\u662F ' + xhr.status);\n return;\n }\n\n result = xhr.responseText;\n if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {\n try {\n result = JSON.parse(result);\n } catch (ex) {\n // hook - fail\n if (hooks.fail && typeof hooks.fail === 'function') {\n hooks.fail(xhr, editor, result);\n }\n\n _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result);\n return;\n }\n }\n if (!hooks.customInsert && result.errno != '0') {\n // hook - fail\n if (hooks.fail && typeof hooks.fail === 'function') {\n hooks.fail(xhr, editor, result);\n }\n\n // 数据错误\n _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno);\n } else {\n if (hooks.customInsert && typeof hooks.customInsert === 'function') {\n // 使用者自定义插入方法\n hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor);\n } else {\n // 将图片插入编辑器\n var data = result.data || [];\n data.forEach(function (link) {\n _this3.insertLinkImg(link);\n });\n }\n\n // hook - success\n if (hooks.success && typeof hooks.success === 'function') {\n hooks.success(xhr, editor, result);\n }\n }\n }\n };\n\n // hook - before\n if (hooks.before && typeof hooks.before === 'function') {\n var beforeResult = hooks.before(xhr, editor, resultFiles);\n if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') {\n if (beforeResult.prevent) {\n // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传\n this._alert(beforeResult.msg);\n return;\n }\n }\n }\n\n // 自定义 headers\n objForEach(uploadImgHeaders, function (key, val) {\n xhr.setRequestHeader(key, val);\n });\n\n // 跨域传 cookie\n xhr.withCredentials = withCredentials;\n\n // 发送请求\n xhr.send(formdata);\n\n // 注意,要 return 。不去操作接下来的 base64 显示方式\n return;\n }\n\n // ------------------------------ 显示 base64 格式 ------------------------------\n if (uploadImgShowBase64) {\n arrForEach(files, function (file) {\n var _this = _this3;\n var reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = function () {\n _this.insertLinkImg(this.result);\n };\n });\n }\n }\n};\n\n/*\n 编辑器构造函数\n*/\n\n// id,累加\nvar editorId = 1;\n\n// 构造函数\nfunction Editor(toolbarSelector, textSelector) {\n if (toolbarSelector == null) {\n // 没有传入任何参数,报错\n throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档');\n }\n // id,用以区分单个页面不同的编辑器对象\n this.id = 'wangEditor-' + editorId++;\n\n this.toolbarSelector = toolbarSelector;\n this.textSelector = textSelector;\n\n // 自定义配置\n this.customConfig = {};\n}\n\n// 修改原型\nEditor.prototype = {\n constructor: Editor,\n\n // 初始化配置\n _initConfig: function _initConfig() {\n // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值\n var target = {};\n this.config = Object.assign(target, config, this.customConfig);\n\n // 将语言配置,生成正则表达式\n var langConfig = this.config.lang || {};\n var langArgs = [];\n objForEach(langConfig, function (key, val) {\n // key 即需要生成正则表达式的规则,如“插入链接”\n // val 即需要被替换成的语言,如“insert link”\n langArgs.push({\n reg: new RegExp(key, 'img'),\n val: val\n\n });\n });\n this.config.langArgs = langArgs;\n },\n\n // 初始化 DOM\n _initDom: function _initDom() {\n var _this = this;\n\n var toolbarSelector = this.toolbarSelector;\n var $toolbarSelector = $(toolbarSelector);\n var textSelector = this.textSelector;\n\n var config$$1 = this.config;\n var zIndex = config$$1.zIndex;\n\n // 定义变量\n var $toolbarElem = void 0,\n $textContainerElem = void 0,\n $textElem = void 0,\n $children = void 0;\n\n if (textSelector == null) {\n // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建\n $toolbarElem = $('
      ');\n $textContainerElem = $('
      ');\n\n // 将编辑器区域原有的内容,暂存起来\n $children = $toolbarSelector.children();\n\n // 添加到 DOM 结构中\n $toolbarSelector.append($toolbarElem).append($textContainerElem);\n\n // 自行创建的,需要配置默认的样式\n $toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc');\n $textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '300px');\n } else {\n // toolbar 和 text 的选择器都有值,记录属性\n $toolbarElem = $toolbarSelector;\n $textContainerElem = $(textSelector);\n // 将编辑器区域原有的内容,暂存起来\n $children = $textContainerElem.children();\n }\n\n // 编辑区域\n $textElem = $('
      ');\n $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');\n\n // 初始化编辑区域内容\n if ($children && $children.length) {\n $textElem.append($children);\n } else {\n $textElem.append($('


      '));\n }\n\n // 编辑区域加入DOM\n $textContainerElem.append($textElem);\n\n // 设置通用的 class\n $toolbarElem.addClass('w-e-toolbar');\n $textContainerElem.addClass('w-e-text-container');\n $textContainerElem.css('z-index', zIndex);\n $textElem.addClass('w-e-text');\n\n // 添加 ID\n var toolbarElemId = getRandom('toolbar-elem');\n $toolbarElem.attr('id', toolbarElemId);\n var textElemId = getRandom('text-elem');\n $textElem.attr('id', textElemId);\n\n // 记录属性\n this.$toolbarElem = $toolbarElem;\n this.$textContainerElem = $textContainerElem;\n this.$textElem = $textElem;\n this.toolbarElemId = toolbarElemId;\n this.textElemId = textElemId;\n\n // 记录输入法的开始和结束\n var compositionEnd = true;\n $textContainerElem.on('compositionstart', function () {\n // 输入法开始输入\n compositionEnd = false;\n });\n $textContainerElem.on('compositionend', function () {\n // 输入法结束输入\n compositionEnd = true;\n });\n\n // 绑定 onchange\n $textContainerElem.on('click keyup', function () {\n // 输入法结束才出发 onchange\n compositionEnd && _this.change && _this.change();\n });\n $toolbarElem.on('click', function () {\n this.change && this.change();\n });\n\n //绑定 onfocus 与 onblur 事件\n if (config$$1.onfocus || config$$1.onblur) {\n // 当前编辑器是否是焦点状态\n this.isFocus = false;\n\n $(document).on('click', function (e) {\n //判断当前点击元素是否在编辑器内\n var isChild = $textElem.isContain($(e.target));\n\n //判断当前点击元素是否为工具栏\n var isToolbar = $toolbarElem.isContain($(e.target));\n var isMenu = $toolbarElem[0] == e.target ? true : false;\n\n if (!isChild) {\n //若为选择工具栏中的功能,则不视为成blur操作\n if (isToolbar && !isMenu) {\n return;\n }\n\n if (_this.isFocus) {\n _this.onblur && _this.onblur();\n }\n _this.isFocus = false;\n } else {\n if (!_this.isFocus) {\n _this.onfocus && _this.onfocus();\n }\n _this.isFocus = true;\n }\n });\n }\n },\n\n // 封装 command\n _initCommand: function _initCommand() {\n this.cmd = new Command(this);\n },\n\n // 封装 selection range API\n _initSelectionAPI: function _initSelectionAPI() {\n this.selection = new API(this);\n },\n\n // 添加图片上传\n _initUploadImg: function _initUploadImg() {\n this.uploadImg = new UploadImg(this);\n },\n\n // 初始化菜单\n _initMenus: function _initMenus() {\n this.menus = new Menus(this);\n this.menus.init();\n },\n\n // 添加 text 区域\n _initText: function _initText() {\n this.txt = new Text(this);\n this.txt.init();\n },\n\n // 初始化选区,将光标定位到内容尾部\n initSelection: function initSelection(newLine) {\n var $textElem = this.$textElem;\n var $children = $textElem.children();\n if (!$children.length) {\n // 如果编辑器区域无内容,添加一个空行,重新设置选区\n $textElem.append($('


      '));\n this.initSelection();\n return;\n }\n\n var $last = $children.last();\n\n if (newLine) {\n // 新增一个空行\n var html = $last.html().toLowerCase();\n var nodeName = $last.getNodeName();\n if (html !== '
      ' && html !== '' || nodeName !== 'P') {\n // 最后一个元素不是


      ,添加一个空行,重新设置选区\n $textElem.append($('


      '));\n this.initSelection();\n return;\n }\n }\n\n this.selection.createRangeByElem($last, false, true);\n this.selection.restoreSelection();\n },\n\n // 绑定事件\n _bindEvent: function _bindEvent() {\n // -------- 绑定 onchange 事件 --------\n var onChangeTimeoutId = 0;\n var beforeChangeHtml = this.txt.html();\n var config$$1 = this.config;\n\n // onchange 触发延迟时间\n var onchangeTimeout = config$$1.onchangeTimeout;\n onchangeTimeout = parseInt(onchangeTimeout, 10);\n if (!onchangeTimeout || onchangeTimeout <= 0) {\n onchangeTimeout = 200;\n }\n\n var onchange = config$$1.onchange;\n if (onchange && typeof onchange === 'function') {\n // 触发 change 的有三个场景:\n // 1. $textContainerElem.on('click keyup')\n // 2. $toolbarElem.on('click')\n // 3. editor.cmd.do()\n this.change = function () {\n // 判断是否有变化\n var currentHtml = this.txt.html();\n\n if (currentHtml.length === beforeChangeHtml.length) {\n // 需要比较每一个字符\n if (currentHtml === beforeChangeHtml) {\n return;\n }\n }\n\n // 执行,使用节流\n if (onChangeTimeoutId) {\n clearTimeout(onChangeTimeoutId);\n }\n onChangeTimeoutId = setTimeout(function () {\n // 触发配置的 onchange 函数\n onchange(currentHtml);\n beforeChangeHtml = currentHtml;\n }, onchangeTimeout);\n };\n }\n\n // -------- 绑定 onblur 事件 --------\n var onblur = config$$1.onblur;\n if (onblur && typeof onblur === 'function') {\n this.onblur = function () {\n var currentHtml = this.txt.html();\n onblur(currentHtml);\n };\n }\n\n // -------- 绑定 onfocus 事件 --------\n var onfocus = config$$1.onfocus;\n if (onfocus && typeof onfocus === 'function') {\n this.onfocus = function () {\n onfocus();\n };\n }\n },\n\n // 创建编辑器\n create: function create() {\n // 初始化配置信息\n this._initConfig();\n\n // 初始化 DOM\n this._initDom();\n\n // 封装 command API\n this._initCommand();\n\n // 封装 selection range API\n this._initSelectionAPI();\n\n // 添加 text\n this._initText();\n\n // 初始化菜单\n this._initMenus();\n\n // 添加 图片上传\n this._initUploadImg();\n\n // 初始化选区,将光标定位到内容尾部\n this.initSelection(true);\n\n // 绑定事件\n this._bindEvent();\n },\n\n // 解绑所有事件(暂时不对外开放)\n _offAllEvent: function _offAllEvent() {\n $.offAll();\n }\n};\n\n// 检验是否浏览器环境\ntry {\n document;\n} catch (ex) {\n throw new Error('请在浏览器环境下运行');\n}\n\n// polyfill\npolyfill();\n\n// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字\nvar inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel { padding: 0; margin: 0; box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * { padding: 0; margin: 0; box-sizing: border-box;}.w-e-clear-fix:after { content: \"\"; display: table; clear: both;}.w-e-toolbar .w-e-droplist { position: absolute; left: 0; top: 0; background-color: #fff; border: 1px solid #f1f1f1; border-right-color: #ccc; border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title { text-align: center; color: #999; line-height: 2; border-bottom: 1px solid #f1f1f1; font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list { list-style: none; line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item { color: #333; padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover { background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block { list-style: none; text-align: left; padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item { display: inline-block; *display: inline; *zoom: 1; padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover { background-color: #f1f1f1;}@font-face { font-family: \\'w-e-icon\\'; src: url(data:application/x-font-woff;charset=utf-8;base64,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) format(\\'truetype\\'); font-weight: normal; font-style: normal;}[class^=\"w-e-icon-\"],[class*=\" w-e-icon-\"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: \\'w-e-icon\\' !important; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before { content: \"\\\\f00d\";}.w-e-icon-upload2:before { content: \"\\\\e9c6\";}.w-e-icon-trash-o:before { content: \"\\\\f014\";}.w-e-icon-header:before { content: \"\\\\f1dc\";}.w-e-icon-pencil2:before { content: \"\\\\e906\";}.w-e-icon-paint-brush:before { content: \"\\\\f1fc\";}.w-e-icon-image:before { content: \"\\\\e90d\";}.w-e-icon-play:before { content: \"\\\\e912\";}.w-e-icon-location:before { content: \"\\\\e947\";}.w-e-icon-undo:before { content: \"\\\\e965\";}.w-e-icon-redo:before { content: \"\\\\e966\";}.w-e-icon-quotes-left:before { content: \"\\\\e977\";}.w-e-icon-list-numbered:before { content: \"\\\\e9b9\";}.w-e-icon-list2:before { content: \"\\\\e9bb\";}.w-e-icon-link:before { content: \"\\\\e9cb\";}.w-e-icon-happy:before { content: \"\\\\e9df\";}.w-e-icon-bold:before { content: \"\\\\ea62\";}.w-e-icon-underline:before { content: \"\\\\ea63\";}.w-e-icon-italic:before { content: \"\\\\ea64\";}.w-e-icon-strikethrough:before { content: \"\\\\ea65\";}.w-e-icon-table2:before { content: \"\\\\ea71\";}.w-e-icon-paragraph-left:before { content: \"\\\\ea77\";}.w-e-icon-paragraph-center:before { content: \"\\\\ea78\";}.w-e-icon-paragraph-right:before { content: \"\\\\ea79\";}.w-e-icon-terminal:before { content: \"\\\\f120\";}.w-e-icon-page-break:before { content: \"\\\\ea68\";}.w-e-icon-cancel-circle:before { content: \"\\\\ea0d\";}.w-e-icon-font:before { content: \"\\\\ea5c\";}.w-e-icon-text-heigh:before { content: \"\\\\ea5f\";}.w-e-toolbar { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 0 5px; /* flex-wrap: wrap; */ /* 单个菜单 */}.w-e-toolbar .w-e-menu { position: relative; text-align: center; padding: 5px 10px; cursor: pointer;}.w-e-toolbar .w-e-menu i { color: #999;}.w-e-toolbar .w-e-menu:hover i { color: #333;}.w-e-toolbar .w-e-active i { color: #1e88e5;}.w-e-toolbar .w-e-active:hover i { color: #1e88e5;}.w-e-text-container .w-e-panel-container { position: absolute; top: 0; left: 50%; border: 1px solid #ccc; border-top: 0; box-shadow: 1px 1px 2px #ccc; color: #333; background-color: #fff; /* 为 emotion panel 定制的样式 */ /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close { position: absolute; right: 0; top: 0; padding: 5px; margin: 2px 5px 0 0; cursor: pointer; color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover { color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title { list-style: none; display: -webkit-box; display: -ms-flexbox; display: flex; font-size: 14px; margin: 2px 10px 0 10px; border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item { padding: 3px 5px; color: #999; cursor: pointer; margin: 0 3px; position: relative; top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active { color: #333; border-bottom: 1px solid #333; cursor: default; font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content { padding: 10px 15px 10px 15px; font-size: 16px; /* 输入框的样式 */ /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus { outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea { width: 100%; border: 1px solid #ccc; padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus { border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] { border: none; border-bottom: 1px solid #ccc; font-size: 14px; height: 20px; color: #333; text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small { width: 30px; text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block { display: block; width: 100%; margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus { border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button { font-size: 14px; color: #1e88e5; border: none; padding: 5px 10px; background-color: #fff; cursor: pointer; border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left { float: left; margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right { float: right; margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray { color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red { color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover { background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after { content: \"\"; display: table; clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item { cursor: pointer; font-size: 18px; padding: 0 3px; display: inline-block; *display: inline; *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container { text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn { display: inline-block; *display: inline; *zoom: 1; color: #999; cursor: pointer; font-size: 60px; line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover { color: #333;}.w-e-text-container { position: relative;}.w-e-text-container .w-e-progress { position: absolute; background-color: #1e88e5; bottom: 0; left: 0; height: 1px;}.w-e-text { padding: 0 10px; overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre { margin: 10px 0; line-height: 1.5;}.w-e-text ul,.w-e-text ol { margin: 10px 0 10px 20px;}.w-e-text blockquote { display: block; border-left: 8px solid #d0e5f2; padding: 5px 10px; margin: 10px 0; line-height: 1.4; font-size: 100%; background-color: #f1f1f1;}.w-e-text code { display: inline-block; *display: inline; *zoom: 1; background-color: #f1f1f1; border-radius: 3px; padding: 3px 5px; margin: 0 3px;}.w-e-text pre code { display: block;}.w-e-text table { border-top: 1px solid #ccc; border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th { border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;}.w-e-text table th { border-bottom: 2px solid #ccc; text-align: center;}.w-e-text:focus { outline: none;}.w-e-text img { cursor: pointer;}.w-e-text img:hover { box-shadow: 0 0 5px #333;}';\n\n// 将 css 代码添加到